1.什么是菱形繼承
倆個子類繼承同一個父類,而又有子類同時繼承這倆個子類,如下圖所示;

#include <iostream>#include <windows.h>using namespace std;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;};int main(){ DD d; d.BB::_aa = 0; d.CC::_aa = 1; d._bb = 2; d._cc = 3; d._dd = 4; system("pause"); return 0;}2.菱形繼承帶來二義性和數據冗余的問題
菱形繼承對象模型

3.虛繼承解決菱形繼承帶來的問題
#include <iostream>#include <windows.h>using namespace std;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;};int main(){ DD d; d.BB::_aa = 0; d.CC::_aa = 1; d._bb = 2; d._cc = 3; d._dd = 4; system("pause"); return 0;}虛繼承對象模型

在這里,BB,CC保存的不再是AA的內容,而是偏移地址,把AA的內容放在公共位置處
新聞熱點
疑難解答
圖片精選