最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

多態(tài)是C++面向對象程序設計的一個重要特性。以前看到虛函數(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++性能測試工具google benchmark

    淺談c++性能測試工具google benchmark

    本文將會介紹如何使用模板以及參數(shù)生成器來批量生成測試用例,簡化繁瑣的性能測試代碼
    2021-06-06
  • C++驗證LeetCode包圍區(qū)域的DFS方法

    C++驗證LeetCode包圍區(qū)域的DFS方法

    這篇文章主要介紹了C++驗證LeetCode包圍區(qū)域的DFS方法,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • c++連接mysql5.6的出錯問題總結

    c++連接mysql5.6的出錯問題總結

    下面小編就為大家?guī)硪黄猚++連接mysql5.6的出錯問題總結。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦
    2016-12-12
  • C++并查集的原理與使用方法

    C++并查集的原理與使用方法

    并查集是一種樹型的數(shù)據(jù)結構,用于處理不相交集合的合并及查詢問題,下面這篇文章主要介紹了C++并查集原理與使用方法的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-12-12
  • C語言數(shù)據(jù)結構之棧和隊列的實現(xiàn)及應用

    C語言數(shù)據(jù)結構之棧和隊列的實現(xiàn)及應用

    棧和隊列是一種數(shù)據(jù)結構,只規(guī)定了性質,并沒有規(guī)定實現(xiàn)方式。本文將以順序結構實現(xiàn)棧,鏈表方式實現(xiàn)隊列,感興趣的小伙伴快跟隨小編一起學習一下吧
    2022-08-08
  • C++ 智能指針使用不當導致內(nèi)存泄漏問題解析

    C++ 智能指針使用不當導致內(nèi)存泄漏問題解析

    這篇文章主要介紹了C++ 智能指針使用不當導致內(nèi)存泄漏問題解析,本文通過代碼示例給大家介紹的非常詳細,感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • C++實現(xiàn)基于EASYX庫掃描線算法

    C++實現(xiàn)基于EASYX庫掃描線算法

    這篇文章主要為大家詳細介紹了C++實現(xiàn)基于EASYX庫掃描線算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-02-02
  • VC實現(xiàn)的病毒專殺工具完整實例

    VC實現(xiàn)的病毒專殺工具完整實例

    這篇文章主要介紹了VC實現(xiàn)的病毒專殺工具完整實例,詳細講述了針對病毒的進程終止、刪除文件及回復注冊表與啟動項等,同時介紹了與之相關的系統(tǒng)函數(shù),非常具有參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • C++中的作用域案例詳解

    C++中的作用域案例詳解

    作用域規(guī)定了標識符在代碼中的可見性和可訪問性,全局作用域中的標識符可以在整個程序中使用,局部作用域中的標識符只能在其所在的代碼塊中使用,而命名空間作用域提供了一種組織和封裝代碼的方式,以避免命名沖突,這篇文章主要介紹了C++中的作用域,需要的朋友可以參考下
    2024-02-02
  • VS2019如何創(chuàng)建C++項目的實現(xiàn)示例

    VS2019如何創(chuàng)建C++項目的實現(xiàn)示例

    這篇文章主要介紹了VS2019如何創(chuàng)建C++項目的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論

沙湾县| 镇平县| 桃园市| 平罗县| 广南县| 古田县| 衡阳县| 革吉县| 喀喇沁旗| 惠水县| 会宁县| 海林市| 团风县| 古丈县| 岱山县| 德兴市| 巍山| 永康市| 蒲城县| 柘城县| 前郭尔| 报价| 武邑县| 常宁市| 油尖旺区| 中超| 木兰县| 乌恰县| 庐江县| 女性| 措美县| 都安| 衢州市| 南昌县| 庆云县| 盐源县| 二手房| 象山县| 眉山市| 盱眙县| 台南县|