麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

探究多態&虛表

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

多態

所謂多態,就是當使用基類的指針或引用調用重寫的虛函數時,當指向父類調用的就是父類的虛函數,指向子類調用的就是子類的虛函數。 下面來通過代碼來理解多態的含義

class AA{public: virtual void fun() { cout << "AA::fun()" << endl; }};class BB : public AA{public: virtual void fun() { cout << "BB::fun()" << endl; }};void FUN(AA& a){ a.fun();}void Test1(){ AA a; BB b; FUN(a); FUN(b);}

結果為: AA::fun() BB::fun() C++的多態分為靜態多態動態多態靜態多態:靜態多態就是重載,因為是在編譯期決議確定。也就是在編譯的時候就能確定函數的地址。 動態多態:是通過繼承重寫基類的虛函數實現的多態,在運行期間決議確定。也就是編譯期間不知道函數的地址,只知道存儲函數地址的虛表的地址。 C++中多態的實現就是通過虛函數實現的,虛函數的對象實例中都存在一張虛函數表。

虛函數表

虛函數表是通過一塊連續內存來存儲虛函數的地址,指明了實際調用的虛函數指針。

class AA{public: virtual void fun1() {} virtual void fun2() {}PRotected: int _a;};void Test2(){ AA a;}

這里寫圖片描述 通過監視窗口可以看到,對象a的首部存儲了一個地址,指向的空間存儲了虛函數的地址,稱為虛函數表。所以sizeof(a)的值為8。

【含有虛函數的單繼承對象模型】

typedef void(*FUNC) ();class AA{public: virtual void fun1() { cout << "AA::fun1()" << endl; } virtual void fun2() { cout << "AA::fun2()" << endl; }protected: int _a;};class BB : public AA{public: virtual void fun1() { cout << "BB::fun1()" << endl; } virtual void fun3() { cout << "BB::fun3()" << endl; }protected: int _b;};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 Test3(){ AA a; BB b; int* VTable1 = (int *)(*(int *)&a); int* VTable2 = (int *)(*(int *)&b); PrintfVTable(VTable1); PrintfVTable(VTable2);}

通過這種方式,可以依次打印出虛表地址以及虛函數的地址,結果如下: 這里寫圖片描述 這里寫圖片描述 虛表后面的0標志著虛表結束,類似于字符串結束符“/0”。

提示:若在windows平臺vs下,程序出現異常中斷,可以“清理解決方案”,這是由于編譯器的小bug,沒有在虛表最后加上0,出現死循環。

【含有虛函數的多繼承對象模型】

typedef void(*FUNC) ();class AA1{public: virtual void fun1() { cout << "AA1::fun1()" << endl; } virtual void fun2() { cout << "AA1::fun2()" << endl; }protected: int _a1;};class AA2{public: virtual void fun1() { cout << "AA2::fun1()" << endl; } virtual void fun2() { cout << "AA2::fun2()" << endl; }protected: int _a2;};class BB : public AA1,public AA2{public: virtual void fun1() { cout << "BB::fun1()" << endl; } virtual void fun3() { cout << "BB::fun3()" << endl; }protected: int _b;};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 Test4(){ BB b; int* VTable = (int *)(*(int *)&b); PrintfVTable(VTable); VTable = (int *)(*((int*)&b + sizeof (AA1) / 4)); PrintfVTable(VTable);}

這里寫圖片描述 這里寫圖片描述


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 一级在线| 日韩.www | 国产免费专区 | 九九精品久久 | 蜜桃av鲁一鲁一鲁一鲁 | 免费在线观看午夜视频 | 最新se94se在线欧美 | 香蕉秀| 一区二区国产在线 | 欧美高清第一页 | 久久久国产精品视频 | 国产99视频在线观看 | 一级一级一级一级毛片 | 蜜桃一本色道久久综合亚洲精品冫 | 色综合欧美 | 亚洲精中文字幕二区三区 | 亚洲最新黄色网址 | 自拍偷拍亚洲图片 | 19禁国产精品福利视频 | 亚州综合图片 | 黄色一级片在线观看 | 亚洲视频成人 | 久久久久久免费 | 欧美一级视屏 | 羞羞答答www网站进入 | 最新在线中文字幕 | 亚洲欧美不卡视频 | 999久久久 | 国产成人羞羞视频在线 | 又黄又爽免费无遮挡在线观看 | 中文字幕在线观看免费 | 91一区二区三区久久久久国产乱 | 黄网站色成年大片免费高 | 日本成人在线免费 | 欧产日产国产精品99 | 午夜精品老牛av一区二区三区 | 欧美日韩国产一区二区三区在线观看 | 免费国产一级淫片 | 欧美精品亚洲人成在线观看 | 久久久久久久久成人 | 亚洲视频综合网 |