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

首頁 > 編程 > C++ > 正文

C++虛函數表實例分析

2020-01-26 15:21:03
字體:
來源:轉載
供稿:網友

多態是C++面向對象程序設計的一個重要特性。以前看到虛函數覺得很神奇,為什么就能實現多態了呢。最初的時候曾設想,要實現運行時多態,應該讓對象的某個部分始終指向一個固定的地址,子類繼承的時候,就修改這個地址的內容。這樣,父類和子類都是到同一個固定地址去讀取內容,在運行時就能表現不同行為。

在看了《深度探索c++對象模型》之后,發現思路是類似的。在對象中,有一個指針指向一張虛函數表,里面按照次序存放了每一個虛函數,當子類繼承的時候,即到虛函數表的指定位置去修改函數地址。當我們通過父類指針來操作一個子類的時候,調用虛函數,都是通過虛函數表+固定的偏移,這樣運行期多態便實現了。

在深度《深度》這本書中,虛函數表大多放在了對象的末端,不知道現在的編譯器是什么樣的,因此本文就來實際做個實驗測試一下。

實驗環境:VC2013 Express

代碼如下:

class Parent {public:  int parent;  Parent() : parent(10) {}  virtual void a() { cout << "Parent::a()" << endl; }  virtual void b() { cout << "Parent::b()" << endl; }  virtual void c() { cout << "Parent::c()" << endl; }};class Child : public Parent {public:  int child;  Child() :child(100) {}  virtual void a() { cout << "Child::a()" << endl; }  virtual void b_child() { cout << "Child::b_child()" << endl; }  virtual void c_child() { cout << "Child::c_child()" << endl; }};class GrandChild : public Child{public:  int grandchild;  GrandChild() :grandchild(1000) {}  virtual void a() { cout << "GrandChild::a()" << endl; }  virtual void b_child() { cout << "GrandChild::b_child()" << endl; }  virtual void c_grandchild() { cout << "GrandChild::c_grandchild()" << endl; }};int main(){  typedef void(*func)();  GrandChild grandchild;  int **vtable = (int **)&grandchild;  for (int i = 0; (func)vtable[0][i] != nullptr; i++)  {    auto pfunc = (func)vtable[0][i];    cout << "  ["<<i<<"] ";    pfunc();  }  return 0;}

結果顯示如下圖所示:

確實,虛函數表指針在對象起始處,并看到了對應項被覆蓋。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 无为县| 墨江| 重庆市| 原平市| 库伦旗| 敦煌市| 嘉善县| 健康| 青河县| 汾西县| 龙门县| 郓城县| 克拉玛依市| 鄂尔多斯市| 汪清县| 南漳县| 梅州市| 宜春市| 彰武县| 临西县| 安宁市| 泰顺县| 沾益县| 家居| 普兰店市| 那曲县| 玛曲县| 龙海市| 乐业县| 黄大仙区| 宁安市| 全南县| 启东市| 高平市| 石阡县| 巫溪县| 鸡泽县| 昆山市| 汝阳县| 屯门区| 年辖:市辖区|