如果乙個類中存在虛函式,在宣告類的物件時,編譯器就會給該物件生成乙個虛函式指標,該虛函式指標指向該類對應的虛函式表。
多型的實現是因為使用了一種動態繫結的機制,在編譯期間不確定呼叫函式的位址,在呼叫虛函式的時候,去查詢虛函式指標所指向的虛函式表。
派生類生成的物件中的虛函式指標指向的是派生類的虛函式表,因此無論是基類還是派生來呼叫,都是查詢的是派生類的表,呼叫的是派生類的函式。
如果發生了多繼承,多個基類中都有虛函式,那麼該是怎樣的呢?虛函式指標如何排列,多個基類的指標為什麼能夠同時指向派生類物件,同時發生多型?
請看下面這段程式
#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...