国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

探究菱形繼承對象模型

2019-11-08 18:23:41
字體:
來源:轉載
供稿:網友

菱形繼承

定義及形式 簡單的理解就是同一個父類被兩個不同子類繼承,而這兩個子類又被另一個新類同時繼承,導致出現了一個類似菱形的繼承體系,我們將其成為菱形繼承。 關于菱形繼承的其他解釋,我在上一博客中做了介紹(http://blog.csdn.net/haitang_yue/article/details/55211296),這里不做贅述。

普通菱形繼承

代碼typedef void (*V_FUNC)();class AA{public: virtual void f1() { cout<<"AA::f1"<<endl; }public: int _aa;};class BB:virtual public AA{public: virtual void f1() { cout<<"BB::f1"<<endl; } virtual void f2() { cout<<"BB::f2"<<endl; }public: int _bb;};class CC:virtual public AA{public: virtual void f1() { cout<<"CC::f1"<<endl; } virtual void f2() { cout<<"CC::f2"<<endl; }public: int _cc;};class DD:public BB,public CC{public: virtual void f1() { cout<<"DD::f1"<<endl; } virtual void f3() { cout<<"DD::f2"<<endl; } virtual void f4() { cout<<"DD::f4"<<endl; }public: int _dd;};void PRintVTable (int* VTable){cout<<" 虛表地址>0x"<< VTable<<endl ;for (int i = 0; VTable[i ] != 0; ++i){V_FUNC f = (V_FUNC) VTable[i];f();}cout<<endl ;}int main(){ DD d; d.BB::_aa = 0; d.CC::_aa = 1; d._bb = 2; d._cc = 3; d._dd = 4; cout<<"DD"; int* VTable = (int*)(*(int*)&d ); PrintVTable(VTable); cout<<"DD-CC"; VTable = (int*)(*((int*)&d+3) ); PrintVTable(VTable); cout<<"DD-AA"; VTable = (int*)(*((int*)&d+7)); PrintVTable(VTable); system("pause"); return 0;}DD類對象模型

這里寫圖片描述

對普通菱形繼承時虛表的分析

這里寫圖片描述

內存中的情況:

由于有兩個父類,所以存在兩個虛表

菱形虛擬繼承

簡介 為了解決菱形繼承中二義性以及數據冗余所帶來的缺點,通過使用虛擬繼承用空間換時間的思想來解決問題。不過應注意,在我們平時的代碼編寫中,不到萬不得已時最好不要使用菱形繼承以及虛繼承,因為這種結構所帶來的效率問題很多。代碼class AA{public: virtual void f1() { cout<<"AA::f1"<<endl; }public: int _aa;};class BB:virtual public AA{public: virtual void f1() { cout<<"BB::f1"<<endl; } virtual void f2() { cout<<"BB::f2"<<endl; }public: int _bb;};class CC:virtual public AA{public: virtual void f1() { cout<<"CC::f1"<<endl; } virtual void f3() { cout<<"CC::f3"<<endl; }public: int _cc;};class DD:public BB,public CC{public: virtual void f1() { cout<<"DD::f1"<<endl; } virtual void f3() { cout<<"DD::f3"<<endl; } virtual void f4() { cout<<"DD::f4"<<endl; }public: int _dd;};typedef void (*V_FUNC)();void PrintVTable(int* VTable){ cout<<"虛表地址>0x"<< VTable<<endl ; for (int i=0;VTable[i]!=0;++i) { V_FUNC f=(V_FUNC)VTable[i]; f(); } cout<<endl ;}int main(){ DD d; d._aa = 1; d._bb = 1; d._cc = 1; d._dd = 1; cout<<"DD"; int* VTable = (int*)(*(int*)&d ); PrintVTable(VTable); cout<<"DD-CC"; VTable = (int*)(*((int*)&d+3) ); PrintVTable(VTable); cout<<"DD-AA"; VTable = (int*)(*((int*)&d+7)); PrintVTable(VTable); system("pause"); return 0;}

運行結果 運行結果

內存分析 內存分析


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 屏东县| 米易县| 鹿邑县| 德阳市| 上饶县| 峨山| 彰化市| 汨罗市| 马鞍山市| 昆明市| 苗栗市| 墨玉县| 抚顺县| 望江县| 闸北区| 昌乐县| 东山县| 兴和县| 普洱| 鹿邑县| 博野县| 山阳县| 康乐县| 连平县| 平和县| 蓬安县| 石景山区| 英德市| 会东县| 正镶白旗| 纳雍县| 新巴尔虎右旗| 建瓯市| 句容市| 青阳县| 定襄县| 大荔县| 德兴市| 丘北县| 古交市| 唐河县|