深度探索c++對象模型(五)

1. 虛繼承的引入(解決訪問二義性)

class A
{
public:
	int m_a;
};

class B:public A
{
public:
	
};

class C :public A
{
public:
	
};

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

int main()
{
	D d;
	d.m_a = 5;	//error

	return 0;
}

在這裏插入圖片描述

解決:

class A
{
public:
	int m_a;
};

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

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

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

在這裏插入圖片描述

2. 兩層結構

class A
{
public:
	int m_a;
};

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

在這裏插入圖片描述

class A1
{
public:
	int m_a1;
};

class A2
{
public:
	int m_a2;
};

class B:virtual public A1, public A2
{
public:
	int m_b;
};

在這裏插入圖片描述

class A1
{
public:
	int m_a1;
};

class A2
{
public:
	int m_a2;
};

class B:virtual public A1, virtual public A2
{
public:
	int m_b;
};

在這裏插入圖片描述

3. 三層結構

class A
{
public:
	int m_a;
};

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

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

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



int main()
{
	cout << sizeof(A) << endl;
	cout << sizeof(B) << endl;
	cout << sizeof(C) << endl;
	cout << sizeof(D) << endl;

	D d;
	d.m_a = 1;
	d.m_b = 2;
	d.m_c = 3;
	d.m_d = 4;

	return 0;
}

在這裏插入圖片描述
在這裏插入圖片描述

現在執行 d.m_a = 4;首先通過第一個vbptr指向的虛基類表中取出第二項,得到偏移爲 20,然後向下移動20個字節得到 m_a存儲的位置,所以訪問虛基類的成員變量要比訪問一般的成員變量慢。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章