返回信息流#include <iostream>
using namespace std;
//定义基类
class Base
{
public:
virtual void Show(){cout<<"Base"<<endl;}
};
//定义派生类
class Derive:public Base
{
public:
virtual void Show(){cout<<"Derive"<<endl;}
};
//主函数
int main()
{
Derive D;
Base B,&Bs=D;
Bs=B;
Bs.Show();
return 0;
}
运行结果:Derive
为什么结果不是 Base?
这是一条镜像帖。来源:北邮人论坛 / cpp / #16952同步于 2008/12/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
虚函数调用
as1302001954
2008/12/1镜像同步13 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
不怎么会C++的人不负责任的说:
&Bs=D; 之后,Bs与D的地址变成了一样
可以把Bs看成D的别名
Bs=B; 改变了D的基类部分(本例中没有变),
自己新增的部分并没有变
所以输出是派生类的东西
【 在 as1302001954 的大作中提到: 】
: #include <iostream>
: using namespace std;
: //定义基类
: ...................
&是引用
【 在 xieys (枫叶/兄弟会悄悄堂堂主/借楼同征外援) 的大作中提到: 】
: 不怎么会C++的人不负责任的说:
: &Bs=D; 之后,Bs与D的地址变成了一样
: 可以把Bs看成D的别名
: ...................
#include <iostream>
using namespace std;
//定义基类
class Base
{
public:
int val;
virtual void Show(){cout<<"Base"<<val<<endl;}
Base (int val):val (val) {}
};
//定义派生类
class Derive:public Base
{
public:
virtual void Show(){cout<<"Derive"<<val<<endl;}
Derive (int val):Base (val) {}
};
//主函数
int main()
{
Derive D (1);
Base B (2),&Bs=D;//Bs是一个B对象的引用,它的vptr里Show函数指向Derive版本
Bs=B;//B的vptr里show函数指向Base版本,B有虚函数,即不具备bit-wise copy语义,不会bitwise copy,vptr不会被改成B的,但val会被改成B的
Bs.Show();
return 0;
}
引用是变量的别名,修改引用就是修改那个变量,不能通过修改引用让它"指"向另一个变量
【 在 as1302001954 (as1302001954) 的大作中提到: 】
: 标 题: 虚函数调用
: 发信站: 北邮人论坛 (Mon Dec 1 10:29:44 2008), 站内
:
: #include <iostream>
: using namespace std;
:
: //定义基类
: class Base
: {
: public:
: virtual void Show(){cout<<"Base"<<endl;}
: };
: //定义派生类
: class Derive:public Base
: {
: public:
: virtual void Show(){cout<<"Derive"<<endl;}
: };
:
: //主函数
: int main()
: {
: Derive D;
: Base B,&Bs=D;
:
: Bs=B;
: Bs.Show();
: return 0;
: }
: 运行结果:Derive
: 为什么结果不是 Base?
: --
: