菱形繼承與虛擬繼承
阿新 • • 發佈:2019-02-07
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是同一個物件,解決了二義性和資料冗餘的問題;