Производный класс может вызывать защищенный конструктор базового класса в его инициализаторе ctor, но только для своего собственного подобъекта базового класса, а не в другом месте:
class Base {
protected:
Base() {}
};
class Derived : Base {
Base b;
public:
Derived(): Base(), // OK
b() { // error
Base b2; // error
}
};
Что говорит об этом стандарт? Здесь [class.protected]/1:
Дополнительная проверка доступа за пределы, описанная выше в разделе 11, применяется, когда нестатические данные член или нестатическая функция-член является защищенным членом его класса именования (11.2). Как описано ранее доступ к защищенному члену предоставляется, поскольку ссылка встречается у друга или члена какого-либо класс
C
. Если доступ заключается в формировании указателя на член (5.3.1), спецификатор вложенного имени должен обозначатьC
или класс, полученный изC
. Все остальные обращения включают (возможно неявное) выражение объекта (5.2.5). В этом случае, класс выражения объекта должен бытьC
или класс, полученный изC
. [Пример:...
Существует ли выражение объекта при вызове конструктора? Нет, не так ли? Итак, где в стандарте описано управление доступом для конструкторов защищенного базового класса?