中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++多繼承多態的實例詳解

發布時間:2020-09-15 11:30:29 來源:腳本之家 閱讀:111 作者:lqh 欄目:編程語言

C++多繼承多態的實現

如果一個類中存在虛函數,在聲明類的對象時,編譯器就會給該對象生成一個虛函數指針,該虛函數指針指向該類對應的虛函數表。

多態的實現是因為使用了一種動態綁定的機制,在編譯期間不確定調用函數的地址,在調用虛函數的時候,去查詢虛函數指針所指向的虛函數表。

派生類生成的對象中的虛函數指針指向的是派生類的虛函數表,因此無論是基類還是派生來調用,都是查詢的是派生類的表,調用的是派生類的函數。

如果發生了多繼承,多個基類中都有虛函數,那么該是怎樣的呢?虛函數指針如何排列,多個基類的指針為什么能夠同時指向派生類對象,同時發生多態?

請看下面這段程序

#include <stdio.h>
#include <iostream>
using namespace std;

class Base1{

  public:
  void fun()
  {
    printf("this is Base1 fun\n");
  }
  virtual void fun1()
  {
    printf("this is Base1 fun1\n");
  }
};

class Base2{
  public:
  void fun()
  {
    printf("this is Base2 fun\n");
  }
  virtual void fun2()
  {
    printf("this is Base2 fun1\n");
  }
};

class Derived : public Base1,public Base2{
  public:
  void fun()
  {
    printf("this is Derived fun\n");
  }
  void fun1()
  {
    printf("this is Derived fun1\n");
  }
  void fun2()
  {
    printf("this is Derived fun2\n");
  }
};

int main()
{
  Derived *pd = new Derived();
  Base1 *p1 = (Base1 *)pd;
  Base2 *p2 = (Base2 *)pd;
  p1->fun();
  p2->fun();
  p1->fun1();
  p2->fun2();
  printf("Base1 p1:%x\n", p1);
  printf("Base2 p2:%x\n", p2);
  return 0;
}

運行結果如下

feng@mint ~/code/c++/cpp_muti_drived 
$ ./muti_derived 
this is Base1 fun
this is Base2 fun
this is Derived fun1
this is Derived fun2
Base1 p1:2097c20
Base2 p2:2097c28

Derived類分別繼承了Base1和Base2,根據結果來看,均發生了多態。基類指針調用函數,調用的均是派生類的對象。

通過打印出了p1和p2的地址,發現他們相差了8個字節,就能明白了,在做類型轉換的過程中,如果把地址傳給第二個基類的指針的時候會自動把地址減去8,在64位系統下,剛好是一個指針的長度。因此p2指向的實際上是第二個虛函數指針的地址,這樣,就能夠實現多繼承的多態了。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

云南省| 翼城县| 盐边县| 柳江县| 滦平县| 军事| 抚顺县| 南皮县| 瓦房店市| 内丘县| 社旗县| 睢宁县| 迭部县| 广饶县| 盐山县| 陆河县| 灵丘县| 泰兴市| 曲松县| 梅河口市| 台中县| 林西县| 韶关市| 井陉县| 内乡县| 大悟县| 云龙县| 亚东县| 阿拉尔市| 西和县| 盐源县| 云南省| 恩平市| 封开县| 盐山县| 万荣县| 板桥市| 广安市| 新沂市| 兴文县| 辉南县|