C++虛函數表執行個體分析_C 語言

來源:互聯網
上載者:User

多態是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;}

結果顯示如下圖所示:

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.