C 學習筆記 關鍵字virtual 虛繼承

2021-10-07 06:09:22 字數 1146 閱讀 9680

(依舊是程設2的筆記)

普通繼承與虛繼承,只有在派生類重複繼承某一基類時,才有區別。virtual可以使派生類在重複繼承乙個基類時,只產生唯一的乙份基類副本。如上圖,當b,c的繼承**為:

class b:virtual public a{};

class c: virtual public a{};

此時d只會繼承乙份a,而不會通過b,c重複繼承了。此時a即為虛基類。

那麼虛繼承的本質是什麼呢?

給出了以下**:

#include

using

namespace std;

classa;

classb:

public a

;classc:

public a

;classd:

public b,

public c

;int

main()

輸出為:

sizeof a is 1

sizeof b is 1

sizeof c is 1

sizeof d is 2

再看以下**:

#include

using

namespace std;

classa;

classb:

virtual

public a

;classc:

virtual

public a

;classd:

public b,

public c

;int

main()

輸出為:

sizeof a is 1

sizeof b is 8

sizeof c is 8

sizeof d is 16

我們注意到,在普通繼承中,b,c的大小與a相同。而虛繼承中,b,c的大小為8位元組,這說明虛基類的派生類包含的其實是指向虛基類的指標。

C 虛函式 virtual關鍵字

當函式被virtual關鍵字修飾時,該函式被稱為虛函式,虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。虛函式最關鍵的特點是 動態聯編 它可以在執行時判斷指標指向的物件,並正確呼叫物件的函式。而函式的過載可以認為是...

C abstract和virtual關鍵字

abstract 顧名思義表示抽象,可以形容方法和類等。為什麼要使用抽象類,個人理解,在設計乙個父類時,會提供一些共同的方法,而繼承的不同子類往往會有一些自己獨特的方法,而這些方法在父類中沒辦法去統一,也沒必要去實現,所以只做方法宣告而不去實現,表示為抽象函式,用於子類去實現。1.抽象方法時沒有實現...

C 開發之 virtual關鍵字 6 8

2.1.1 使用virtual關鍵字修飾屬性語法形式 修飾屬性 public virtual 資料型別 屬性名 2.1.2 使用virtual關鍵字修飾方法語法形式 修飾方法 訪問修飾符 virtual 返回值型別 方法名 2.1.3 說明2.1.3 重寫override例如在父類中有乙個求長方形面...