亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++虛函數(shù)表實例分析

 更新時間:2014年09月05日 10:37:10   投稿:shichen2014  
這篇文章主要介紹了C++虛函數(shù)表,對多態(tài)中用到的虛函數(shù)表進行了比較通俗的實例分析,需要的朋友可以參考下

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

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

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

實驗環(huán)境: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;
}

結果顯示如下圖所示:

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

相關文章

  • 一文學會c語言結構體的定義和使用方法

    一文學會c語言結構體的定義和使用方法

    數(shù)組是一種數(shù)據(jù)形式,其特點是多個相同類型的元素集合起來,結構體是另一種重要的數(shù)據(jù)形式,特點是將不同類型的成員組合起來,下面這篇文章主要給大家介紹了關于c語言結構體的定義和使用方法的相關資料,需要的朋友可以參考下
    2022-11-11
  • C++實現(xiàn)順序排序算法簡單示例代碼

    C++實現(xiàn)順序排序算法簡單示例代碼

    這篇文章主要介紹了C++實現(xiàn)順序排序算法簡單示例代碼,對于學過C++的朋友一定不會陌生,現(xiàn)在重溫一下這個算法,需要的朋友可以參考下
    2014-08-08
  • C++加密解密php代碼的方法

    C++加密解密php代碼的方法

    這篇文章主要介紹了C++加密解密php代碼的方法,實例分析了基于C++實現(xiàn)加密解密的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • C++布隆過濾器的使用示例

    C++布隆過濾器的使用示例

    寧可錯殺一千,也不放過一個,這是布隆過濾器的特點,本文主要介紹了C++布隆過濾器的使用示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-09-09
  • 詳解c++20協(xié)程如何使用

    詳解c++20協(xié)程如何使用

    這篇文章主要介紹了詳解c++20協(xié)程如何使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • c++如何將一個char轉(zhuǎn)化為string

    c++如何將一個char轉(zhuǎn)化為string

    這篇文章主要介紹了c++如何將一個char轉(zhuǎn)化為string問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++ API功能設計的實現(xiàn)

    C++ API功能設計的實現(xiàn)

    C++ API中看似很小的修改,都可能會影響到生成的對象和庫文件的二進制表示,如果客戶想替換共享庫使之工作,就不能簡單的替換庫文件了事,而往往需要重新編譯
    2022-08-08
  • C++中的內(nèi)存分區(qū)介紹

    C++中的內(nèi)存分區(qū)介紹

    這篇文章主要介紹了C++中的內(nèi)存分區(qū)介紹,C++的內(nèi)存劃分為棧區(qū)、堆區(qū)、全局區(qū)/靜態(tài)區(qū)、字符串常量和代碼區(qū),本文分別對他們一一說明,需要的朋友可以參考下
    2015-07-07
  • C語言實現(xiàn)三角函數(shù)表

    C語言實現(xiàn)三角函數(shù)表

    這篇文章主要為大家詳細介紹了C語言三角函數(shù)表,打印出相對應的三角函數(shù)值,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • WM_CLOSE、WM_DESTROY、WM_QUIT及各種消息投遞函數(shù)詳解

    WM_CLOSE、WM_DESTROY、WM_QUIT及各種消息投遞函數(shù)詳解

    這篇文章主要介紹了WM_CLOSE、WM_DESTROY、WM_QUIT及各種消息投遞函數(shù),有助于讀者更好的理解windows程序的消息機制,需要的朋友可以參考下
    2014-07-07

最新評論