结论:在子类声明为private的虚函数,通过父类的引用仍然可以访问该函数。
我们先看一段代码:
#include<iostream>
using namespace std;
class A
{
public:
virtual void f() { cout << "af" << endl; }
};
class B : public A
{
private:
virtual void f() { cout << "bf" << endl; }
virtual void h() { cout << "bh" << endl; }
};
int main()
{
B i;
A & j = i;
j.f();
system("pause");
return 0;
}
运行结果:
可见我们的结论是正确的。
个人解释:
对于访问的控制权限,是编译器强加于程序员,使我们的程序更加符合oo的规范。对于运行期间并不存在所谓的访问控制权限(我们只要得到了函数的指针就可以为(wei)所(suo)欲为。而虚函数属于动态联编,在运行期间得到函数指针,所以完全不受访问权限的控制。
------------------------------------------------------------------------------------------
另:之前一直困惑我的一个问题
在子类中定义了虚函数(而父类中没有定义),那该虚函数的指针应存在于vptr指向的vtbl中,而且vptr存放于对象内存的前4个字节中(x86),按理说程序在运行期间,父类指针或引用可以从vtbl中找到该虚函数的,但事实上在编译阶段编译器直接报错,即编译不通过。
以上的解释也符合此情况,即在编译期间,编译器即已认定父类指针或引用中无此函数(父类怎么会知道子类定义了那些函数呢enenen很好理解的嘛),所以直接编译报错。