关于多继承和虚继承一点说明

一、派生类的基类还有共同的基类,且基类继承方式为virtual

class A{
public:
	int b;
	A(string &p){
		s = p;
		cout << "This is Class A G:" << p << endl;
	}
	~A(){
		cout << "This is Class A X:" << s << endl;
	}
private:
	string s;
};

class B1:virtual public A{
public:
	B1(string &p):A(p){
		sb1 = p;
		cout << "This is Class B1 G:" << p << endl;
	}
	~B1(){
		cout << "This is Class B1 X:" << sb1 << endl;
	}
private:
	string sb1;
};

class B2 :virtual public A{
public:
	B2(string &p):A(p){
		sb2 = p;
		cout << "This is Class B2 G:" << p << endl;
	}
	~B2(){
		cout << "This is Class B2 X:" << sb2 << endl;
	}
private:
	string sb2;
};

class C :public B1, public B2{
private:
	string sc;
public:
	C(string &p):B1(p),B2(p),A(p){     //特别注意!!加virtural的时候,还要加上类A的构造函数
		sc = p;
		cout << "This is Class C G:" << p << endl;
	}
	~C(){
		cout << "This is Class C X:" << sc << endl;
	}
};

在这里插入图片描述
virtual继承说明:

  • 如上程序,B1 B2为virtual继承时,C的初始化列表中必须加上A的构造函数,即使C不为多继承,仅继承B1,其初始化列表也要加上A的构造函数初始化
  • virtual继承后,C中仅有一个b,属于A类,而不存在B1::b和B2::b
  • virtual继承后,仅执行一遍A类的构造函数,且是第一个执行的,之后再按继承顺序执行直接继承类的构造函数

二、派生类的基类还有共同的基类,且基类继承方式不为virtual

class A{
public:
	int b;
	A(string &p){
		s = p;
		cout << "This is Class A G:" << p << endl;
	}
	~A(){
		cout << "This is Class A X:" << s << endl;
	}
private:
	string s;
};

class B1: public A{
public:
	B1(string &p):A(p){
		sb1 = p;
		cout << "This is Class B1 G:" << p << endl;
	}
	~B1(){
		cout << "This is Class B1 X:" << sb1 << endl;
	}
private:
	string sb1;
};

class B2 : public A{
public:
	B2(string &p):A(p){
		sb2 = p;
		cout << "This is Class B2 G:" << p << endl;
	}
	~B2(){
		cout << "This is Class B2 X:" << sb2 << endl;
	}
private:
	string sb2;
};

class C :public B1, public B2{
private:
	string sc;
public:
	C(string &p):B1(p),B2(p){     //不加virtural的时候,就不用加上A的构造函数
		sc = p;
		cout << "This is Class C G:" << p << endl;
	}
	~C(){
		cout << "This is Class C X:" << sc << endl;
	}
};

在这里插入图片描述
说明:

  • 第二基类不为virtual继承时,派生类不需要在其构造函数初始化列表中初始化第一基类,由其父类(第二基类)初始化时对第一基类进行初始化,且此时派生类中存在多个第一基类中的变量,分别属于其不同的父类,如上,B1::b,B2::b
  • 构造函数的执行顺序,是派生类继承时声明的顺序,且第一基类的构造函数要执行多次(如上,A的构造函数执行了两次)

三、派生类的基类一个是virtual,一个是非virtual时

class A{
public:
	int b;
	A(string &p){
		s = p;
		cout << "This is Class A G:" << p << endl;
	}
	~A(){
		cout << "This is Class A X:" << s << endl;
	}
private:
	string s;
};

class B1: public A{
public:
	B1(string &p):A(p){
		sb1 = p;
		cout << "This is Class B1 G:" << p << endl;
	}
	~B1(){
		cout << "This is Class B1 X:" << sb1 << endl;
	}
private:
	string sb1;
};

class B2 :virtual public A{
public:
	B2(string &p):A(p){
		sb2 = p;
		cout << "This is Class B2 G:" << p << endl;
	}
	~B2(){
		cout << "This is Class B2 X:" << sb2 << endl;
	}
private:
	string sb2;
};

class C :public B1, public B2{
private:
	string sc;
public:
	C(string &p):B1(p),B2(p),A(p){     //这里报错,说A的构造函数执行时不明确,所以不能这么搞
		sc = p;
		cout << "This is Class C G:" << p << endl;
	}
	~C(){
		cout << "This is Class C X:" << sc << endl;
	}
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值