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

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

菱形繼承與虛擬菱形繼承對象模型

2019-11-08 03:13:22
字體:
來源:轉載
供稿:網友

菱形繼承對象模型

下面用一段菱形繼承的代碼來探究菱形繼承的對象模型

class AA{public: virtual void fun1() { cout << "AA::fun1()" << endl; }public: int _a;};class BB : public AA{public: virtual void fun1() { cout << "BB::fun1()" << endl; }public: int _b;};class CC : public AA{public: virtual void fun1() { cout << "CC::fun1()" << endl; }public: int _c;};class DD :public BB,public CC{public: virtual void fun1() { cout << "DD::fun1()" << endl; } virtual void fun2() { cout << "DD::fun2()" << endl; }public: int _d;};void Test1(){ DD d; d.BB::_a = 1; d.CC::_a = 2; d._b = 3; d._c = 4; d._d = 5;}

打開內存窗口,進行單步調試,結果如下: 這里寫圖片描述 這里寫圖片描述 對于對象d,重寫了fun1(),所以將DD的fun1()放入虛表,再將fun2()放入虛表,圖片中另一個虛表指針指向的是CC中的虛函數,CC中的fun1()重寫了AA中的fun1(),所以在虛表中放入CC的fun1()。這一這樣理解,橙色區域本來應給是AA類,續表中存儲的是AA::fun1()的地址,但是BB類中從寫了fun1(),所以把AA::fun1()替換為了CC::fun1()。所以,對于一個類中的虛函數,若是重寫的父類的,則將虛表中的函數地址替換為自己的虛函數地址,若不是重寫的函數,則直接將該函數地址放入虛表中。

菱形虛擬繼承對象模型

現在把上面的代碼改為虛擬繼承,再來看內存窗口中的結果: 這里寫圖片描述 這里寫圖片描述 下面提供完整的代碼調用虛函數

class AA{public: virtual void fun1() { cout << "AA::fun1()" << endl; }public: int _a;};class BB : virtual public AA{public: virtual void fun1() { cout << "BB::fun1()" << endl; }public: int _b;};class CC : virtual public AA{public: virtual void fun1() { cout << "CC::fun1()" << endl; }public: int _c;};class DD :public BB,public CC{public: virtual void fun1() { cout << "DD::fun1()" << endl; } virtual void fun2() { cout << "DD::fun2()" << endl; }public: int _d;};typedef void(*FUNC) ();void PRintfVTable(int *VTable){ cout << "虛表地址:" << "0x" << VTable << endl; for (int i = 0; VTable[i] != 0; ++i) { cout << "虛函數地址:0x" << VTable[i] << " "; FUNC f = (FUNC)VTable[i]; f(); } cout << endl;}void Test1(){ DD d; d.BB::_a = 1; d.CC::_a = 2; d._b = 3; d._c = 4; d._d = 5; int* VTable = (int *)(*(int *)&d); PrintfVTable(VTable); VTable = (int *)(*((int*)&d + 6)); PrintfVTable(VTable);}

這里寫圖片描述


上一篇:Crackme 1

下一篇:RCP中showView方法的說明

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 科技| 阳东县| 石台县| 曲沃县| 开化县| 西藏| 师宗县| 无棣县| 瓦房店市| 怀集县| 东方市| 察隅县| 商洛市| 吴旗县| 海丰县| 巴林左旗| 绥滨县| 河北省| 永济市| 广汉市| 襄汾县| 南陵县| 阜新| 峨边| 井研县| 东兰县| 宝鸡市| 勐海县| 都兰县| 乐亭县| 额尔古纳市| 淮安市| 固镇县| 和林格尔县| 青铜峡市| 蕉岭县| 林周县| 汨罗市| 东光县| 海丰县| 南召县|