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()函数? 展开
#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()函数? 展开
2个回答
展开全部
你用的是基类指针当然是调用基类的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()
不知道你想表达什么意思
假如想使用多态可以把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()
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询