91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎么在c++中利用虛函數實現多態

發布時間:2021-06-02 16:46:17 來源:億速云 閱讀:311 作者:Leah 欄目:編程語言

今天就跟大家聊聊有關怎么在c++中利用虛函數實現多態,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

#include<iostream>
using namespace std;
class CFather 
{
public:
  virtual void AA()  //虛函數標識符
  {
    cout << "CFather :: AA()" << endl;
  }
  void BB()
  {
    cout << "CFather :: BB()" << endl;
  }
};
class CSon : public CFather
{
public:
  void AA()
  {
    cout << "CSon :: AA()" << endl;
  }
  void BB()
  {
    cout << "CSon :: BB()" << endl;
  }
};
int main()
{
  cout << sizeof(CFather) << endl;         //測試加了虛函數的類

  system("pause");
  return 0;
}

怎么在c++中利用虛函數實現多態

很明顯類里裝了一個 4個字節的東西,除了整形int,就是指針了,沒錯這里裝的就是函數指針

先把這個代碼,給抽象成圖形進行理解,在這CFather為A,CSon為B

怎么在c++中利用虛函數實現多態

此時就是一個單純的繼承的情況,不存在虛函數,然后我new一個對象,A *p = new A;那么 p -> AA(),必然是指向A類中的AA()函數,那么函數的調用有兩種方式 一種函數名加()直接調用,一種是利用函數指針進行調用,在這里我想要調用子類的,就可以利用函數指針進行調用,假設出來兩個函數指針,來指向B類中的兩個成員函數,如果我父類想要調用子類成員,就可以通過 p指針去調用函數指針,再通過函數指針去調用成員函數

怎么在c++中利用虛函數實現多態

每一個函數都可以用一個函數指針去指著,那么每一類中的函數指針都可以形成自己的一個表,這個就叫做虛函數表

怎么在c++中利用虛函數實現多態

那么在創建對象后,為什么類中會有四個字節的內存空間呢?

在C++的標準規格說明書中說到,編譯器必需要保證虛函數表的指針存在于對象中最前面的位置(這是為了保證正確取到虛函數的偏移量)。這意味著我們通過對象實例的地址得到這張虛函數表,然后就可以遍歷其中函數指針,并調用相應的函數。也就是說這四個字節的指針,代替了上圖中(p->*pfn)()的作用,指向了函數指針,也就是說,在使用了虛函數的父類成員函數,雖然寫的還是p->AA(),實際上卻是,(p->*(vfptr[0])),而指向哪個虛函數表就由,創建的對象來決定

怎么在c++中利用虛函數實現多態

至此,就能理解如何用虛函數這個機制來實現多態的了

下面,我將分別說明“無覆蓋”和“有覆蓋”時的虛函數表的樣子。沒有覆蓋父類的虛函數是毫無意義的。我之所以要講述沒有覆蓋的情況,主要目的是為了給一個對比。在比較之下,我們可以更加清楚地知道其內部的具體實現。

無虛數覆蓋

下面,再讓我們來看看繼承時的虛函數表是什么樣的。假設有如下所示的一個繼承關系:

怎么在c++中利用虛函數實現多態

請注意,在這個繼承關系中,子類沒有重載任何父類的函數。那么,在派生類的實例中,Derive d; 的虛函表:

怎么在c++中利用虛函數實現多態

我們可以看到下面幾點:

1)虛函數按照其聲明順序放于表中。

2)父類的虛函數在子類的虛函數前面。

有虛數覆蓋

覆蓋父類的虛函數是很顯然的事情,不然,虛函數就變得毫無意義。下面,我們來看一下,如果子類中有虛函數重載了父類的虛函數,會是一個什么樣子?假設,我們有下面這樣的一個繼承關系。

怎么在c++中利用虛函數實現多態

為了讓大家看到被繼承過后的效果,在這個類的設計中,我只覆蓋了父類的一個函數:f()。那么,對于派生類的實例,其虛函數表會是下面的一個樣子:

怎么在c++中利用虛函數實現多態

我們從表中可以看到下面幾點,

1)覆蓋的f()函數被放到了虛表中原來父類虛函數的位置。

2)沒有被覆蓋的函數依舊。

這樣,我們就可以看到對于下面這樣的程序,

Base *b = new Derive();

b->f();

看完上述內容,你們對怎么在c++中利用虛函數實現多態有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

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

c++
AI

宣武区| 东阿县| 合山市| 神池县| 林甸县| 寿光市| 周至县| 福安市| 黄平县| 灌阳县| 揭东县| 阳朔县| 腾冲县| 吴旗县| 株洲市| 延川县| 正镶白旗| 左贡县| 稷山县| 西华县| 陇西县| 阿拉善盟| 开原市| 甘南县| 奉贤区| 凉城县| 上饶市| 高阳县| 乌审旗| 灵石县| 乌兰浩特市| 奇台县| 福贡县| 平昌县| 高台县| 台江县| 临朐县| 葫芦岛市| 察隅县| 汕头市| 健康|