Если B наследует от A с помощью public, может ли B переопределить одну из функций и сделать ее закрытой?
НЕТ
Несмотря на то, что my_func1()
объявлен в priavte
спецификаторе доступа, он все еще может вызываться через указатель на class A
, фактически указывающий на объект class B
Вызов my_func1()
оценивается во время выполнения в зависимости от типа объекта, на который указывает указатель. Во время компиляции компиляция видит вызов my_func1()
как вызов A::my_func1()
, и поскольку A::my_func1()
является общедоступным, компилятор не сообщает только об ошибке. Только во время выполнения оценивается фактический вызов функции B::my_func1()
.
Конечно, вы не можете напрямую вызывать my_func1()
через объект class B
, хотя, потому что B::my_func1()
объявлено в спецификаторе Private Access, и вы не можете получить доступ к частно объявленным членам вне класса.
Как насчет обратного? если тип наследования является закрытым - может ли B заставить определенную функцию быть открытой?
нет NO
Если вы вызываете my_func1()
через указатель Base class A
, то во время компиляции он просто оценивается как вызов A::my_func1()
, то есть Invalid
, поскольку A::my_func1() is declared private in
class A`
Что если А чисто чистый? это имеет значение?
нет NO
Не имеет значения, является ли базовый класс абстрактным или просто полиморфным. Будут применяться те же правила.
Имеет ли защищенное значение какое-либо значение в любой комбинации?
нет NO
Как объяснялось в первых 2 Вопросах, если вы вызываете виртуальный указатель на базовый класс, то во время компиляции компилятор проверяет только доступ к этой функции-члену в базовом классе, потому что компилятор видит это как вызов функции-члена базового класса. Фактический вызов функции оценивается в run time
, а функция называется Runtime Polymorphism
или Dynamic polymorphism
, которая не зависит от спецификаторов Access, что является конструкцией времени компиляции.
Итак, в заключение,
переопределение членов базового класса не влияет на доступ