c 多繼承多型

2021-08-02 17:54:08 字數 1084 閱讀 3117

如果乙個類中存在虛函式,在宣告類的物件時,編譯器就會給該物件生成乙個虛函式指標,該虛函式指標指向該類對應的虛函式表。

多型的實現是因為使用了一種動態繫結的機制,在編譯期間不確定呼叫函式的位址,在呼叫虛函式的時候,去查詢虛函式指標所指向的虛函式表。

派生類生成的物件中的虛函式指標指向的是派生類的虛函式表,因此無論是基類還是派生來呼叫,都是查詢的是派生類的表,呼叫的是派生類的函式。

如果發生了多繼承,多個基類中都有虛函式,那麼該是怎樣的呢?虛函式指標如何排列,多個基類的指標為什麼能夠同時指向派生類物件,同時發生多型?

請看下面這段程式

#include 

#include

using

namespace

std;

class base1

virtual

void fun1()

};class base2

virtual

void fun2()

};class derived : public base1,public base2

void fun1()

void fun2()

};int main()

執行結果如下

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指向的實際上是第二個虛函式指標的位址,這樣,就能夠實現多繼承的多型了。

多繼承多型

include iostream using namespace std c 中沒有介面的概念 c 中可以使用純虛函式實現介面 介面類中只有函式原型定義,沒有任何資料的定義。class inte ce1 class inte ce2 class parent class child public p...

C 多型 繼承多型

什麼是多型?個人理解為 在程式語言繼承關係中,子類能替代父類,表現出不同的行為。換句話說 在繼承關係中,乙個類被例項化被其子類替代,子類中有父類的虛方法重寫,或者有父類同名方法 new 呼叫相同方法時候,將表現出子類或者父類中不同行為 老闆,上 static void main string arg...

C 繼承多型

1 什麼是繼承?舉例說明 繼承 子類繼承父類,繼承而得到的類稱為派生類,被繼承的類叫做基類 public class humanity 基類 public string id public string name public string public int age public class s...