您的位置:首页 > 编程语言 > C语言/C++

为什么基类指针(或引用)可以调用派生类的private虚函数

2017-07-18 14:25 387 查看
在基类中定义了public虚函数,在派生类中将其重写,但是设置为private,为什么通过基类指针仍然可以发生动态绑定调用派生类中的private虚函数?

例子如下:

class Base
{
public:
// public虚函数
virtual void Disp() { cout << "base.\n"; }
};

class Derived : public Base
{
private:
// 重写基类虚函数,但是放在private中
virtual void Disp() { cout << "derived.\n"; }
};

void main()
{
Derived Dobj;
Base *pBase = &Dobj;
pBase->Disp();    // 显示的结果是派生类的虚函数被调用!
}
正确的解释:派生类中虚函数的访问权限是在编译阶段由基类确定的,在运行阶段不再检查访问权限,所以,虚函数的访问权限与派生类就没关系了。

更进一步的解释:当pBase->Disp()时,首先通过这个对象的vptr找到对应的vtable, 因为它实际上是Derived对象,所以找到的是Derived的虚表,所有的Derived对象都共用这个虚表。又因为是通过基类的指针调用的,编译器从Base的类型信息中查到Disp是虚表中的第一个entry, 而且这个函数的访问权限是public的,所以首先它让你调用,其次,从虚表第一个entry中取出的函数地址对应着Derived::Disp, 所以最后是Derived::Disp被调用,Derived::Disp在Derived中的访问权限在这里是无关的了,编译器根本不会费事去查询这一信息。甚至这一信息可能根本编译器也不知道。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐