C++菱形繼承和菱形虛擬繼承
阿新 • • 發佈:2019-01-26
單繼承&多繼承&菱形繼承
單繼承:一個子類只有一個直接父類時稱這個繼承關係為單繼承。
多繼承:一個子類有兩個或以上直接父類時稱這個繼承關係為多繼承
菱形繼承(鑽石繼承)存在二義性和資料冗餘問題。
菱形虛擬繼承解決了菱形繼承的二義性和資料冗餘問題。但使用虛繼承解決資料冗餘問題也帶來了效能上的損耗。#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位元組。
通過彙編檢視如下圖