1. 程式人生 > >C++菱形繼承和菱形虛擬繼承

C++菱形繼承和菱形虛擬繼承

單繼承&多繼承&菱形繼承

單繼承:一個子類只有一個直接父類時稱這個繼承關係為單繼承。

多繼承:一個子類有兩個或以上直接父類時稱這個繼承關係為多繼承

菱形繼承(鑽石繼承)存在二義性和資料冗餘問題。


#include <iostream>
using namespace std;

class A
{
public:
	int _a;
};

class B : public A
{
public:
	int _b;
};

class C : public A
{
public:
	int _c;
};

class D : public B, public C
{
public:
	int _d;
};

int main()
{
	D d;
	d.B::_a = 0;
	d._b = 1;
	d.C::_a = 2;
	d._c = 3;
	d._d = 4;
	return 0;
}

菱形虛擬繼承解決了菱形繼承的二義性和資料冗餘問題。但使用虛繼承解決資料冗餘問題也帶來了效能上的損耗。


#include <iostream>
using namespace std;

class A
{
public:
	int _a;
};

class B: virtual public A
{
public:
	int _b;
};

class C : virtual public A
{
public:
	int _c;
};

class D : public B, public C
{
public:
	int _d;
};

int main()
{
	D d;
	d._a = 0;
	d._b = 1;
	d._c = 2;
	d._d = 3;
	return 0;
}

菱形虛擬繼承中,通過除錯檢視記憶體可知,B類和C類物件模型前4位元組儲存的地址是偏移量表,而偏移量表指向的前4位元組儲存的是該類本身相對於D物件模型的偏移量後4位元組儲存的是A類的成員變數_a相對於該類自身(B類或C類)的偏移量,分別為20位元組、12位元組。

通過彙編檢視如下圖