Существует общее недопонимание того, что на самом деле означает protected
.Это означает, что производный класс может обращаться к этому конкретному члену на самой , а не на других объектах.Компилятор должен был отклонить обе функции, так как в обоих случаях он обращается к конструктору объекта, который не относится к производному типу.
Другой пример, который проще обсудить на предмет его правильности, будет:*
Закомментированная строка является ошибкой, поскольку она пытается изменить объект типа base
, не обязательно объект derived
.Если бы язык позволил скомпилировать этот код, вы могли бы изменить объект типа base
или даже объекты типов derived1
, derived2
..., эффективно нарушая правила доступа.
struct derived2 : base {};
int main() {
base b;
derived2 d;
derived::modify( b ); // modifying a base!!!
derived::modify( d ); // modifying a derived2!!!
}