C++关于赋值兼容原则 20

代码如下:#include<iostream>usingnamespacestd;classB0{public:voiddisplay(){cout<<"B0::disp... 代码如下:
#include<iostream>
using namespace std;

class B0
{
public:
void display(){cout<<"B0::dispaly()"<<endl;}
};
class B1:public B0
{
public:
void display(){cout<<"B1::display()"<<endl;}
};
class D1:public B1
{
public:
void display(){cout<<"D1::display()"<<endl;}
};
void fun(B0 *ptr)
{
ptr->display();
}
void main()
{
B0 b0;
B1 b1;
D1 d1;
B0 *p;
p=&b0;
fun(p);
p=&b1;
fun(p);
p=&d1;
fun(p);

}
运行结果:
B0::display()
B0::display()
B0::display()
press any key to continue

问题:
结果为什么不是
B0::display()
B1::display()
D1::display()
根据赋值兼容原则
公有派生类对象的地址可赋给基类指针变量
所以这里p应该分别指向对象b0,b1,d1
在根据同名覆盖原则
p->display()应该分别调用B0,B1,D1类各自的display()函数
这里为什么全调用B0类的display()函数?
展开
 我来答
Ritzberry
2010-05-09 · TA获得超过453个赞
知道小有建树答主
回答量:330
采纳率:0%
帮助的人:402万
展开全部
你用的是基类指针当然是调用基类的display
不知道你想表达什么意思
假如想使用多态可以把display定义为虚函数

或者使用子类指针调用
B1 *p1=&b1;
p1->display();

只有virtual有override之说
对于非虚函数,发生的是name hiding
就好像是
namespace M{
int i;
namespace N{
int i; // name hiding
}
}

ps
搞混override和name hide,lz是不是用谭老头的书阿,
再解释一下吧

class B{
public:
virtual f(){}
g(){}
h(int){}
}

class D :public B{
public:
f(){}//这个是override,也就是覆盖
g(){}//这个是name hiding,不知道咋翻译,就名称隐藏吧
}

D d;
D *pd=&d;
B *pb &d;

pd->f();//D::f()
pb->f();//D::f()
pd->g();//D::g()
pb->g();//B::g()
pd->B::g();//B::g()
百度网友db582c3
2010-05-09 · TA获得超过1268个赞
知道答主
回答量:290
采纳率:0%
帮助的人:147万
展开全部
virtual 关键字.........大哥.....服了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式