| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1468 人关注过本帖
标题:[原创][求助]类,派生类,虚函数,构造函数在一段代码中的执行顺序
只看楼主 加入收藏
szd1105
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-11-25
收藏
 问题点数:0 回复次数:10 
[原创][求助]类,派生类,虚函数,构造函数在一段代码中的执行顺序
#include "iostream,h"
class I1
{
public:
virtual void func()
{
cout << "I1" << endl;
}
};

class B1
{
public:
B1 (int i)
{
cout <<"B1" << endl;
}
};

class B2 : public I1
{
public:
virtual void func()
{
cout << B2 << endl;
};
B2 (int i)
{
cout << "B2" << i << endl;
func() ;
};

class D1 : public B1 , public virtual B2
{
public:
D1() : B1 (1) , b1(2) , B2 (3) , b2 (4)
{
}
B2 b2;
B1 b1;
};

int main()
{
D1 d;
return 0;
}
请问这段代码输出结果的顺序是什么
搜索更多相关主题的帖子: 函数 派生类 构造 顺序 
2006-12-02 13:31
a402730324
Rank: 5Rank: 5
等 级:贵宾
威 望:18
帖 子:1233
专家分:0
注 册:2005-12-1
收藏
得分:0 
B1
B2
B2
B1

敢犯强汉者,虽远必诛!——陈汤 不知吾辈何时方能吐出此豪言壮语?
2006-12-02 14:21
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
你的程序有几个小错误
1.class B2 里面的func()的cout<<B2<<endl;,B2应该加上"";
2.B2(int i)最后加上};

输出结果:
B23
B2
B1
B24
B2
B1

需要注意的是:虚拟基类构造是由最终派生类来负责的;不管虚拟基类出现在继承的那个层次,总是先调用虚拟基类的构造函数

拿这段程序来说,D1先继承B1,但是B1没有基类了,关键在B2,D1虚拟继承于B2,B2继承于I1

由于D1是最终派生类,所以他的虚拟基类的构造就由他负责,D1()的初始化列表里有B2(3),所以先调用B2::B2(int i),
B2(int i)会先调用I1的构造函数,但是I1没有写默认构造函数,所以执行B2::B2(int i)的函数体,先输出B23,
之后调用B2::func()(虽然这里不会有什么问题,但是还是需要注意的一点是虚函数的调用机制在构造函数里不起作用),输出B2;

虚拟基类构造完毕之后,其他基类及成员按照他们声明的顺序依次构造

先是基类B1,由于D1()的初始化列表里有B1(1),所以调用B1::B1(int i),输出B1;

由于虚基类B2已经构造完毕,所以用4初始化成员b2,调用B2::B2(int i),先输出B24;
之后B2::func()输出B2;

之后用2初始化b1,调用B1::B1(int i),输出B1;

之后D1()的函数体,but nothing;

至此d构造完毕。

2006-12-02 14:51
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
说的有点乱了,呵呵

2006-12-02 14:58
szd1105
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-11-25
收藏
得分:0 
谢谢你的解说 ,我能够看明白

好象第3个结果和最后一个是B11 , B12.
2006-12-02 16:02
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
你运行试试不就知道了吗

2006-12-02 16:09
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
你运行试试不就知道了吗

2006-12-02 16:09
szd1105
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-11-25
收藏
得分:0 
如果《之后用2初始化b1,调用B1::B1(int i),输出B1;》你写的这段文字输出的结果是B1,那么用2初始化就显的多余了
2006-12-02 16:21
litcatyx
Rank: 1
等 级:新手上路
威 望:1
帖 子:151
专家分:0
注 册:2006-10-27
收藏
得分:0 
是用2初始化b1没错,因为初始化列表里写的b1(2),
这会调用B1::B1(int i),并且将实参2传递给形参i,但是B1的构造函数里没有用到i,
这是构造函数的问题,与初始化不初始化无关

2006-12-02 16:34
szd1105
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-11-25
收藏
得分:0 
如果是这样的话,那么不管《D1() : B1 (1) , b1(2) , B2 (3) , b2 (4)》这中的B1初始化为(多少),结果始终为B1
请问是不是
2006-12-02 16:49
快速回复:[原创][求助]类,派生类,虚函数,构造函数在一段代码中的执行顺序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013430 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved