(依舊是程設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例如在父類中有乙個求長方形面...