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;
}
 
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号