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