程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++虛函數表實例剖析

C++虛函數表實例剖析

編輯:關於C++

C++虛函數表實例剖析。本站提示廣大學習愛好者:(C++虛函數表實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是C++虛函數表實例剖析正文


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

成果顯示以下圖所示:

確切,虛函數表指針在對象肇端處,並看到了對應項被籠罩。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved