虚继承及其派生类构造函数

当虚继承时 有构造函数的情况下应该注意什么?

直接看代码

#include <iostream>
using namespace std;

class Base0 {
public:
	Base0(int var) :var0(var) {}
	int var0;
	void fun0() { cout << "Member of Base0,var0 is " << var0 << endl; }
};
class Base1:virtual public Base0 {
public:
	Base1(int var):Base0(var){}
	int var1;
};
class Base2 :virtual public Base0 {
public:
	Base2(int var):Base0(var){}
	int var2;
};
class Derived :public Base1, public Base2 {
public:
	Derived(int var):Base0(var),Base1(var),Base2(var)
	{}
	int var;
	void fun() { cout << "Member of Derived" << endl; }
};

int main()
{

	Derived d(1);
	d.var0 = 2;
	d.fun0();
	return 0;
}

 单步调试一下

进入Derived构造函数

 进入Base0构造函数

 回到Derived构造函数  可到var0已被Base0的构造函数初始化

进入Base1构造函数

给Base0构造函数打上断点 看下一步进不进去

没有进去 直接回到了Derived构造函数

 进入Base2构造函数

 同样 没有进去Base0构造函数 直接回去了

 继续执行

看到这儿大家应该都很清楚了  直接把结论说了:

1.建立对象时所指定的类称为最远派生类

2.虚基类的成员是由最远派生类的构造函数通过调用虚基类的构造函数进行初始化的

3.在整个继承结构中  直接或间接继承虚基类的所有派生类 都必须在构造函数的成员初始化表中为虚基类的构造函数列出参数  如果未列出 则表示调用该虚基类的默认构造函数(如果虚基类没有默认构造函数就会报错)

4.在建立对象时 只有最远派生类的构造函数调用虚基类的构造函数 其他类对虚基类构造函数的调用被忽略

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值