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存儲的位置,所以訪問虛基類的成員變量要比訪問一般的成員變量慢。