本章介绍菱形继承、虚继承和类型适应。
1、菱形继承与虚继承
在多继承中,可能会发生多个父类共基类的问题,即菱形继承。
例如:
 
 
解决办法:
父类继承基类时使用虚继承,在继承前加virtual,即:虚继承。
虚继承:
使共同基类只产生一个拷贝,只对第一个调用有效,对其他派生类都是虚假的,没有调用构造函数。
举例:
        D继承自B和C,B类继承A类,C类也继承A类
         
#include<iostream>
using namespace std;
class A
{
public:
	int a;
	void show()
	{
		cout << "我是基类Dshow" << endl; 
	}	
};
class B:virtual public A
{
	
};
class C:virtual public A
{
	
};
class D:public B,public C
{
	
};
int main()
{
	D obj;
	obj.show(); 
	return 0;
}			不加virtual会报错:[Error] request for member 'show' is ambiguous
2、类型适应
派生类的对象、指针、引用适用于基类对象、指针、引用
可以将子类的对象 、指针 、 引用 赋值给 基类的对象、指针、引用
举例:
        
#include<iostream>
using namespace std;
class A
{
public:
	int xp; 
	A(int x=0)
	{
		xp = x;
	}
	
	void show()
	{
		cout << "xp" << xp << endl;
	}
};
class B:public A 
{
public:
	int yp;
	B(int x=0,int y=0):A(x)
	{
		yp = y;
	}
	
	void show()
	{
		cout << "xp:" << xp << ",yp" << yp << endl;
	}
};
int main()
{
	A a(5);
	B b(1,5);
	a.show();
	b.show();
	
	// 基类的对象 = 子类的对象 
	a = b;	
	a.show(); // 基类的对象只能调用基类的show函数
	
	// 使用基类的指针 指向子类对象
	A  *t = &b; 	
	t->show();  // 基类的指针只能调用基类的show函数
	
	// 基类的引用 引用子类的对象
	A &k = b;	
	k.show();	 // 基类的引用只能调用基类的show函数
	
	return 0;
}


















