c++中的乙個重要特徵是多型即使用同名函式實現不同的功能,多型分為編譯時的多型和執行時的多型,編譯時的多型主要是指運算子過載和函式過載,而執行時的多型主要是指派生類和虛函式的多型,即使用基類的應用或指標可以引用派生類中的方法(不能引用基類中沒有而派生類中新增的方法),如果沒有指明是虛函式,指向派生類的指標或引用將會直接呼叫基類中的方法。這是由於如果定義為虛函式,將會在物件中增加乙個虛函式表,來存放虛函式位址,如果派生類重新定義了虛函式,將同時更改虛函式位址,將位址改為指向派生類中的方法。
例如:
#include"stdio.h"
#include using namespace std;
class a
;a::a()
a::a(char *str)
void a::show()
基類中的show方法沒有設為虛函式,則直接呼叫基類的show
執行結果為
如果在show前面增加virtual,基類將會呼叫派生類的方法
執行結果為
補充:1建構函式不能為虛函式,建構函式不能被過載
2 複製建構函式和運算子不能為虛函式
3析構函式應該為虛函式,銷毀派生類應該呼叫派生類的析構函式,而不能呼叫基類的析構函式
c 虛函式解析
c 的多型性用一句話概括就是 在基類的函式前加上virtual關鍵字,在派生類中重寫該函式,執行時將會根據物件的實際型別來呼叫相應的函式。如果物件型別是派生類,就呼叫派生類的函式 如果物件型別是基類,就呼叫基類的函式 1.用virtual關鍵字申明的函式叫做虛函式,虛函式肯定是類的成員函式。2.存在...
C 虛函式解析
具體內容請參見 陳浩部落格之c vtable解析 我只是為了更加理解這裡面說明的要點,所以自己編寫了幾個對應與他部落格內容的幾個小demo,大家可以按照這幾個demo來進行實驗,這樣更加方便的理解這裡面的知識。如果有什麼疑問,大家可以在當前位置提問,或者可以去我的github上new乙個issue!...
C 虛函式解析
在c 中,在基類的成員函式宣告前加上關鍵字virtual即可讓該函式成為虛函式,派生類中對此函式的不同實現都會繼承這一修飾符,允許後續派生類覆蓋,達到遲繫結的效果。即便是基類中的成員函式呼叫虛函式,也會呼叫到派生類中的版本 例如,乙個基類animal有乙個虛函式eat。子類fish要實做乙個函式ea...