设为首页收藏本站

新微赢技术网

 找回密码
 注册
搜索
热搜: 回贴
查看: 1991|回复: 9
打印 上一主题 下一主题

[原创][求助]类,派生类,虚函数,构造函数在一段代码中的执行顺序

[复制链接]
跳转到指定楼层
1#
发表于 2009-11-4 01:23:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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;
}
请问这段代码输出结果的顺序是什么
2#
发表于 2009-11-4 01:23:58 | 只看该作者
B1
B2
B2
B1
回复 支持 反对

使用道具 举报

3#
发表于 2009-11-4 01:23:59 | 只看该作者
你的程序有几个小错误
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构造完毕。
回复 支持 反对

使用道具 举报

4#
发表于 2009-11-4 01:24:00 | 只看该作者
说的有点乱了,呵呵
回复 支持 反对

使用道具 举报

5#
发表于 2009-11-4 01:24:01 | 只看该作者
谢谢你的解说 ,我能够看明白

好象第3个结果和最后一个是B11 , B12.
回复 支持 反对

使用道具 举报

6#
发表于 2009-11-4 01:24:02 | 只看该作者
你运行试试不就知道了吗
回复 支持 反对

使用道具 举报

7#
发表于 2009-11-4 01:24:03 | 只看该作者
你运行试试不就知道了吗
回复 支持 反对

使用道具 举报

8#
 楼主| 发表于 2009-11-4 01:24:04 | 只看该作者
如果《之后用2初始化b1,调用B1::B1(int i),输出B1;》你写的这段文字输出的结果是B1,那么用2初始化就显的多余了
回复 支持 反对

使用道具 举报

9#
发表于 2009-11-4 01:24:05 | 只看该作者
是用2初始化b1没错,因为初始化列表里写的b1(2),
这会调用B1::B1(int i),并且将实参2传递给形参i,但是B1的构造函数里没有用到i,
这是构造函数的问题,与初始化不初始化无关
回复 支持 反对

使用道具 举报

10#
发表于 2009-11-4 01:24:07 | 只看该作者
如果是这样的话,那么不管《D1() : B1 (1) , b1(2) , B2 (3) , b2 (4)》这中的B1初始化为(多少),结果始终为B1
请问是不是
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

申请友链|小黑屋|最新主题|手机版|新微赢技术网 ( 苏ICP备08020429号 )  

GMT+8, 2024-11-18 23:35 , Processed in 0.113637 second(s), 8 queries , Gzip On, Memcache On.

Powered by xuexi

© 2001-2013 HaiAn.Com.Cn Inc. 寰耽

快速回复 返回顶部 返回列表