码迷,mamicode.com
首页 > 其他好文 > 详细

13. 多重继承

时间:2020-05-22 10:07:03      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:安全   避免   aaa   end   多重继承   length   相同   sof   rtu   

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. 多重继承

标签:安全   避免   aaa   end   多重继承   length   相同   sof   rtu   

原文地址:https://www.cnblogs.com/Nutshelln/p/12934968.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!