C++ 多继承、菱形继承、虚继承

先给大家看一下菱形继承的结构:

B和C都单继承了A

D继承了B和C 是多继承 有两个或两个以上的基类就是多继承

class  A
{
public:
	A(int a = 0) :ma(a)
	{
		cout << "A" << endl;
	}
public:
	int ma;
};

class B : public A
{
public:
	B(int b) :mb(b),A(b)
	{
		cout << "B" << endl;
	}
public:
	int mb;
};
class C : public A
{	
public:
	C(int c) :mc(c), A(c)
	{
		cout << "C" << endl;
	}
public:
	int mc;
};
class D : public B, public C
{
public:
	D(int d) :md(d),B(d),C(d)
	{
		cout << "D" << endl;
	}
public:
	int md;
};

菱形继承造成的问题:就是D中有两份A中的数据ma 就是所谓的二义性 编译都通不过

为了解决这个问题 可以用虚继承来解决 

虚继承的原则就是:谁从A直接继承 就让谁虚继承A

B和C虚继承A

class  A
{
public:
	A(int a = 0) :ma(a)
	{
		cout << "A" << endl;
	}
	virtual void Show()
	{
	
	}
public:
	int ma;
};
class B : virtual public A
{
public:
	B(int b) :mb(b),A(b)
	{
		cout << "B" << endl;
	}
public:
	int mb;
};
class C : virtual public A
{	
public:
	C(int c) :mc(c), A(c)
	{
		cout << "C" << endl;
	}
public:
	int mc;
};
class D : public B, public C
{
public:
	D(int d) :md(d),B(d),C(d)
	{
		cout << "D" << endl;
	}
public:
	int md;
};
B、C都从A虚继承 此时A成为虚基类 这样就可以解决D中有两份A数据的问题 解决了二义性的问题





猜你喜欢

转载自blog.csdn.net/moon5555/article/details/79888049