访问权限的作用仅在程序编译期(由编译器控制),一旦超出编译期进入执行期(程序脱离编译器控制),访问权限则消失的无影无踪(即在真实内存中没有任何访问权限设置痕迹)。
所以在基类的虚函数访问权限决定了编译器在编译 pf->func(),这样指令时给不给你访问,它只能检测是你基类的指针/引用调用了虚函数,不知道指针/引用的基类还是子类,更不知道虚函数表里的有没有重写更改地址。在运行时编译器无权设置访问权限。
结论:
实现多态时,虚函数能不能访问看基类是不是public访问权限,与派生类的虚函数访问权限无关。
(不实现多态被认为是子类还是要检查的)
class A
{
public:
virtual void f()
{
cout<<"A::f()"<<endl;
}
};
class B : public A
{
private:
virtual void f()
{
cout<<"B::f()"<<endl;
}
};
A* pa = (A*)new B;
pa->f();
输出:B::f()