虛繼承 虛函式

2021-08-28 14:02:48 字數 1514 閱讀 7690

1. 虛繼承簡單的說就是如果有兩個類都繼承了同乙個基類(a),那麼,如果有第三個類又繼承了這兩個類,第三個類就會出現有      兩個基類(a)的情況,虛繼承就能避免這種情況。

從實現**來看:

普通繼承:

/**

普通繼承(沒有使用虛基類)*/

// 基類a

class a;

class b : public a;

class c : public a;

class d : public b, public c

;

虛繼承:

/**

虛繼承(虛基類)*/

#include // 基類a

class a;

class b : virtual public a;

class c : virtual public a;

class d : public b, public c

;

從實現原理來說,就是虛繼承的話 派生類物件 會產生乙個 虛表指標(就是乙個指標),指向乙個虛表 ,物件d 繼承了b、c

也會同時繼承兩個虛表指標,兩個虛表指標指向的虛表上有記錄 b、c 都有的基類在物件d ,記憶體中的乙個偏移距離,從而

實現了d中指揮有乙個a 。

建議大家還可以去看看這個大神的部落格

2.  虛函式 

先說一下c++ 有動態繫結和靜態繫結的區別。 靜態繫結是指編譯器在編譯的時候就完成了繫結,比如函式過載,編譯器會根據傳遞給函式的引數就可以判定使用哪乙個過載函式。

而動態繫結,就是靠虛函式的機制來實現的,並實現了多型機制,多型是物件導向程式設計語言的基本特徵之一。在c++中,多型就是利用基類指標指向子類(注意:只能子類轉換成基類)例項,然後通過基類指標呼叫子類(虛)函式,從而實現乙個介面,多種形態的效果。(可能有點繞,多讀幾遍就好了)

或者使用基類的引用來呼叫虛函式也可實現

下面 用乙個簡單的例子看看效果啦:

class base1 

void func2()

};class base2 : public base1

};int main()

輸出結果: 自己理解理解,注意我上面講的動態繫結。

下面講一下具體實現原理:

每乙個帶虛函式的類物件在記憶體位址的開頭都會有乙個虛表指標 指向了乙個虛表,表上記錄了物件內 虛函式 的位址。

每乙個繼承了 這個帶虛函式 的類 例項化的物件(並且重寫了,基類中的虛函式),也會有乙個虛表指標,並且這虛表指標之指向的虛表上記錄的是 是當前類內的 (已經重寫的)那個函式的位址。

這樣的話,當用基類指標指向子類例項時就會用虛表上記錄的函式來呼叫了,也就是會呼叫基類重寫後的。

虛函式 虛繼承

include using namespace std class a class b public a class c public b int main 結果是 4,4,4 為什麼?一,在private,protect,public的實際繼承中,派生類和基類擁有相同的虛函式表。但如果是虛繼承,會...

虛函式,虛繼承

1 空類,空類單繼承,空類多繼承的sizeof include using namespace std class base1 class base2 class derived1 public base1 class derived2 public base1,public base2 int m...

虛繼承和虛函式繼承

虛繼承主要用於菱形 形式的繼承形式 虛繼承是為了在多繼承的時候避免引發歧義,比如類 有個就是a,繼承了 c也繼承了 當 多繼承 時,就會有歧義產生了,所以要使用虛擬繼承避免重複拷貝。虛函式繼承是解決多型性的,當用基類指標指向派生類物件的時候,基類指標呼叫虛函式的時候會自動呼叫派生類的虛函式,這就是多...