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

多态访问私有成员?

fromwithin
2008/5/18镜像同步22 回复
class A { public: int a; virtual void show() { cout<<1; } }; class B : public A { private: int a; virtual void show() { cout<<2; } }; void main() { A *a1 = new A(); A *a2 = new B(); a1->a; a2->a; a1->show(); a2->show(); } 输出: 12 也就是说多态以后可以直接调用私有成员变量和成员函数了,这是为什么呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
yywbupt机器人#1 · 2008/5/18
【 在 fromwithin 的大作中提到: 】 : class A : { : public: : ................... 这是两回事,访问成员函数那个是多态,访问的是派生类的函数,虚函数是通过虚函数表来访问的,派生类的虚函数表里面的函数指针指向的是派生类的函数,自然访问的就是派生类的函数啊 而访问成员变量访问的是基类的变量,和多态无关
fromwithin机器人#2 · 2008/5/19
多谢LS解答, 但是我的疑惑主要是为什么多态就能直接调用子类的私有成员?是因为虚函数表不考虑权限吗?
silentime机器人#3 · 2008/5/19
a2->a;这里的a还是父类的a 【 在 fromwithin 的大作中提到: 】 : 多谢LS解答, 但是我的疑惑主要是为什么多态就能直接调用子类的私有成员?是因为虚函数表不考虑权限吗?
fromwithin机器人#4 · 2008/5/19
【 在 silentime 的大作中提到: 】 : a2->a;这里的a还是父类的a 我是说成员函数...
hokkien机器人#5 · 2008/5/20
个人以为,这只是编译器问题,其实也没多大意义
ny机器人#6 · 2008/5/20
试了一下g++里面是子类的a,有没有人出来解释一下,是不是各个编译器不一样造成的还是语言方面的原因? 【 在 silentime 的大作中提到: 】 : a2->a;这里的a还是父类的a
thunderlight机器人#7 · 2008/5/20
【 在 fromwithin 的大作中提到: 】 : 多谢LS解答, 但是我的疑惑主要是为什么多态就能直接调用子类的私有成员?是因为虚函数表不考虑权限吗? 要考虑。只不过在编译期间a2->show()中的a2是当作基类指针来处理的,该权限也是在编译期间考虑的(在基类中为public)。而实际邦定是在运行期间的。。。
yywbupt机器人#8 · 2008/5/20
【 在 thunderlight 的大作中提到: 】 : 要考虑。只不过在编译期间a2->show()中的a2是当作基类指针来处理的,该权限也是在编译期间考虑的(在基类中为public)。而实际邦定是在运行期间的。。。 nb啊,thunderlight~~ 不过这么解释也还是有破绽的,在编译派生类的时候,我可以由于该函数是private的,而把派生类的虚函数表中对应的函数指针指向基类的函数,那么此时a2->show()访问的就是基类的 函数了。 lz的疑问换句话来说就是:由于派生类的虚函数是private的,就应该对它应用“隐藏(Hide)”规则,为什么实际上却是应用“覆盖(Override)”规则? 如果非要说出个之所以然,那么最好是从语义的角度来考虑,语言设计者这么设计可能是出于某种应用上的考虑来做的,至于是什么考虑,暂时没想到,等大牛来解答。
yywbupt机器人#9 · 2008/5/20
【 在 ny 的大作中提到: 】 : 试了一下g++里面是子类的a,有没有人出来解释一下,是不是各个编译器不一样造成的还是语言方面的原因? 我用Dev来试了一下是父类的,不知道Dev算不算g++。。。或许你再检查一下你的代码。。。