13. 多重继承

Posted nutshelln

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13. 多重继承相关的知识,希望对你有一定的参考价值。

1.构造顺序:按继承顺序,先继承的先构造,同样遵循先构造父类,再构造子类的规则。

2.析构顺序,与构造顺序相反。

3.内存分布:按继承顺序,先继承的分布在前,同样遵循先构造父类,再构造子类的规则。

class Sofa {
public:
	Sofa() { cout << "Sofa()" << endl; }
	void Sit() { cout << "Sofa Sit" << endl; }
	int length = 0xaaaaaaaa;
	int color = 1;
};

class Bed {
public:
	Bed() { cout << "Bed()" << endl; }
	void Sleep() { cout << "Bed Sleep" << endl; }
	int width = 0xbbbbbbbb;
	int color = 2;
};

class SofaBed : public Sofa, public Bed  {
public:
	SofaBed() { cout << "SofaBed()" << endl; }
	int height = 0xdddddddd;
};

int  main() {
	SofaBed sb;
	sb.Sit();
	sb.Sleep();

	Sofa *pSofa = &sb;
	pSofa->length = 1;

	Bed *pBed = &sb;//安全,指针会定位到Bed数据开始的地址
	pBed->width = 2;

	//sb.color = 3;// error C2385: 对“color”的访问不明确
	sb.Sofa::color = 3;//指明是哪个作用域
	
	return 0;
}

  

菱形继承(钻石继承)

问题:两个父类分别从祖宗类继承了一份数据,子类从两个父类继承,则子类有两份祖宗类的数据。

虚继承:解决菱形继承的问题,继承时添加virtual关键字,使相同的祖宗类成员在内存中只有一份。

虚继承时构造顺序:先构造祖宗类,再按继承顺序构造父类,最后构造孙类。

虚继承时析构顺序:与构造顺序相反。

注意:避免使用菱形继承,结构复杂且效率低下。

class Furniture {
public:
	int color = 1;
};

class Sofa : virtual public Furniture {//虚继承,继承时添加virtual关键字
public:
	Sofa() { cout << "Sofa()" << endl; }
	void Sit() { cout << "Sofa Sit" << endl; }
	int length = 0xaaaaaaaa;
};

class Bed : virtual public Furniture {//虚继承,继承时添加virtual关键字
public:
	Bed() { cout << "Bed()" << endl; }
	void Sleep() { cout << "Bed Sleep" << endl; }
	int width = 0xbbbbbbbb;
};

class SofaBed : public Sofa, public Bed  {
public:
	SofaBed() { cout << "SofaBed()" << endl; }
	int height = 0xdddddddd;
};

int  main() {
	SofaBed sb;
	sb.Sit();
	sb.Sleep();

	Sofa *pSofa = &sb;
	pSofa->length = 1;

	Bed *pBed = &sb;//安全,指针会定位到Bed数据开始的地址
	pBed->width = 2;

	sb.color = 3;//由于虚继承,SofaBed中只有一份color了
	
	return 0;
}

  

以上是关于13. 多重继承的主要内容,如果未能解决你的问题,请参考以下文章

尽管基数为空,为啥多重继承会增加对象的大小?

为什么像Java,C#和VB.NET现代面向对象的语言不支持多重继承[复制]

Python学习 Day13 Python 面向对象学习2:@property多重继承

C++中多重继承构造函数执行顺序

第53课 被遗弃的多重继承(上)

Scala多重继承及AOP