c++中的繼承有單繼承和多繼承;本文主要探索的是多繼承中菱形繼承的二義性和數據冗餘及解決方案;
菱形繼承的對象模型:
從內存看菱形繼承對象模型:
用一個簡易 的代碼來說明二義性和數據冗餘這個問題:
class AA{
public:
int _aa;
};
class BB : public AA{
public:
int _bb;
};
class CC : public AA{
public:
int _cc;
};
class DD : public BB, public CC{
public:
int _dd;
};
void test()
{
DD s;
s.BB::_aa = 0;
s.CC::_aa = 1;
s._bb = 2;
s._cc = 3;
s._dd = 4;
}
創建DD對象:
DD s;
s._aa = 1;訪問_aa時會出現對_aa訪問不明確的錯誤,可能是BB中的_aa,也可能是CC中的_aa;這就是二義性的問題;
可以指定所屬類域來解決二義性問題,s.BB::_aa = 1; s.CC::_aa = 0; 但是這個並沒有解決數據冗餘的問題;
這就需要用到虛繼承來解決二義性和數據冗餘的問題;
class AA{
public:
int _aa;
};
class BB :virtual public AA{
public:
int _bb;
};
class CC :virtual public AA{
public:
int _cc;
};
class DD : public BB, public CC{
public:
int _dd;
};
void test()
{
DD s;
s.BB::_aa = 0;
s.CC::_aa = 1;
s._bb = 2;
s._cc = 3;
s._dd = 4;
}
從內存看菱形虛擬繼承對象模型:
由上圖可以看出BB和CC中的_aa是同一個對象,解決了二義性和數據冗餘的問題;