Я пытался выяснить, что происходит, когда производный класс объявляет виртуальную функцию частной. Ниже приведена программа, которую я написал
#include <iostream>
using namespace std;
class A
{
public:
virtual void func() {
cout<<"A::func called"<<endl;
}
private:
};
class B:public A
{
public:
B()
{
cout<<"B constructor called"<<endl;
}
private:
void func() {
cout<<"B::func called"<<endl;
}
};
int main()
{
A *a = new B();
a->func();
return 0;
}
Удивительно (для меня) выход был:
B constructor called
B::func called
Разве это не нарушает набор личных прав для этой функции. Это ожидаемое поведение? Это стандартное обходное решение или лазейка? Уровни доступа обойдены при разрешении вызовов функций через VTABLE?
Любое понимание этого поведения было бы очень полезно.
Кроме того, было упомянуто, что частное переопределение виртуального члена помешает другим классам наследовать его. Даже у этого есть проблемы. Изменение указанной программы включает:
class C: public B
{
public:
void func() {
cout<<"C::func called"<<endl;
}
};
и основной тестовой программы:
int main()
{
A *a = new C();
a->func();
return 0;
}
:
C::func called