Почему объект подкласса не может
рассматриваться как объект
суперкласс, когда наследство
защищенный или частный?
Это, безусловно, можно считать объектом суперкласса. Однако такое рассмотрение ограничено (модификатором public / protected / private наследования), но только (частное наследование) или это подклассы (защищенное наследование).
Все внешние объекты не могут рассматривать класс как таковой, аналогично тому, как им не разрешен доступ к защищенным или закрытым методам или переменным . Аналогия довольно уместна, если выражена правильно.
Таким образом, сам класс, его подклассы (и друзья) могут видеть это как отношения, но внешний мир не имеет права это делать.
Следующий код показывает это в действии:
class Base {
public: virtual ~Base() {}
};
class PublicDerived: public Base
{ };
class ProtectedDerived: protected Base {
void test() {
Base* base2 = this; // OK
}
};
class ProtectedSubClass: public ProtectedDerived {
void test() {
Base* base2 = this; // OK
}
};
class PrivateDerived: private Base {
void test() {
Base* base2 = this; // OK
}
};
class PrivateSubClass: public PrivateDerived {
void test() {
Base* base2 = this; // Error (line 28)
}
};
int main()
{
PublicDerived publicD;
ProtectedDerived protectedD;
PrivateDerived privateD;
Base* base1 = &publicD;
Base* base2 = &protectedD; // Error (line 39)
Base* base3 = &privateD; // Error (line 40)
}
Обратите внимание, что не имеет значения, как классы xxxSubClass наследуются от своих суперклассов. Это все о том, как суперклассы происходят от Base , что и должно быть.
Компилятор соответственно жалуется:
inherit.cpp(28) : error C2247: 'Base' not accessible because 'PrivateDerived' uses 'private' to inherit from 'Base'
inherit.cpp(1) : see declaration of 'Base'
inherit.cpp(20) : see declaration of 'PrivateDerived'
inherit.cpp(1) : see declaration of 'Base'
inherit.cpp(29) : error C2243: 'type cast' : conversion from 'PrivateSubClass *const ' to 'Base *' exists, but is inaccessible
inherit.cpp(39) : error C2243: 'type cast' : conversion from 'ProtectedDerived *' to 'Base *' exists, but is inaccessible
inherit.cpp(40) : error C2243: 'type cast' : conversion from 'PrivateDerived *' to 'Base *' exists, but is inaccessible