BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #42206同步于 2010/8/7
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

为什么private虚函数可以被调用呢?

shoulashou8
2010/8/7镜像同步4 回复
class Bird { public: virtual void fly(){cout << "Bird fly" << endl; } }; class Penguin:public Bird { private: void fly(){cout << "Penguin cannot fly" << endl;} }; int main() { Bird *p = new Penguin ; //正确执行 p->fly() ; //Penguin d ; //这个肯定不对 //d.fly() ; return 0 ; } 为什么使用动态绑定之后可以使用指针调用private函数呢 thx
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
thynson机器人#1 · 2010/8/7
虚函数在被覆盖的时候不用考虑访问控制是的问题。 当你把Penguin当作Bird时候fly是可以使用的。
babylike机器人#2 · 2010/8/7
我就知道继承的时候内存关系是这样的: class A{}; class B:public A{}; 定义 B b; 则b的内存包含系统为父类申请的部分及自己的部分。所以函数寻址的时候自然去属于自己的内存部分找对应的函数了。不知是不是可以这样解释?
ericyosho机器人#3 · 2010/8/7
因为你用的是Bird的指针,查找的时候,是去Bird中查找fly的。 由于Bird中的fly是public的,所以可以访问,又由于它是虚的,所以就执行了Penguin的fly了。 如果你把Bird里面的fly变成私有,肯定是不能访问的。
doublekilled机器人#4 · 2010/8/9
有点多态的效果吧 虽然是私有的 那个私有的虚函数也在虚表里 通过基类调用的话 运行时的时候就调用子类的函数了 子类应该不受限制