注册 登录
编程论坛 VC++/MFC

求高手,以下程序运行结果以及具体过程??????

山之子 发布于 2010-10-31 13:45, 611 次点击
#include<iostream.h>
class Base1
{
public:
    Base1(){cout<<"class Base1"<<endl;}
};
class Base2
{
public:
    Base2(){cout<<"class Base2"<<endl;}
};
class Level1:public Base2,virtual public Base1
{
public:
    Level1(){cout<<"class Level1"<<endl;}
};
class Level2:public Base2,virtual public Base1
{
public:
    Level2(){cout<<"class Level2"<<endl;}
};
class TopLevel:public Level1,virtual public Level2
{
public:
    TopLevel(){cout<<"class TopLevel"<<endl;}
};
void main()
{
    TopLevel obj;
}
8 回复
#2
shafeilong2010-10-31 21:51
溯本追源  要找到这个人是谁,就必须翻开户口,找到他老爸老妈,鉴定下是不是亲生的 往祖宗一直找
然后取他们的血液,一步一步下来,OK 找到了
#3
shafeilong2010-10-31 21:52
base 1
base 2
level2
base2
level1
toplevel1
#4
山之子2010-11-01 15:49
回复 3楼 shafeilong
能不能告诉我,这是为什么啊???
#5
hahayezhe2010-11-02 09:08
首先你要明确3点,
构造是从派生类的基类优先开始的
根据编辑器不同对于子类派生的多个派生基类采取从右往左(或从左往右)
虚拟派生不会重复构造基类,而会产生一个指针,该指针指向虚基类表(不是虚函数表),当然根据编辑器的不同采取的方式不同

在VS2008 从右往左 优先 virtual public Level2
而Level2 派生于public Base2,virtual public Base1
接着根据以上规则 :优先构造Base1(产生一指针,指向虚基类表,发现不存在Base1实例,则构造Base1),再Base2,然后在Level2本身

Level2完了 初始化public Level1
Level1派生于 public Base2,virtual public Base1
由于Base1是虚拟派生的那么产生一个指针,该指针指向虚基类表,发现Base1以存在一个实例(也就是已经被构造了一次)
则不在重复构造Base1,  而Base2不是虚拟派生,则构造Base2,然后构造Level1
最后toplevel1

具体相关知识你可以参照C++面向对象模型里的构造语意学




[ 本帖最后由 hahayezhe 于 2010-11-2 09:10 编辑 ]
#6
sunmingchun2010-11-02 20:27
5楼回答正确。
#7
永会2011-04-17 23:28
class Base1
class Base2
class Level2
class Base2
class Level1
class TopLevel
#8
永会2011-04-17 23:28
class Base1
class Base2
class Level2
class Base2
class Level1
class TopLevel
#9
wina19842011-04-22 10:24
HR发现这个帖子很不错,有换工作的意向么?
jiamuwang@
1