虛函式: 在某基類中宣告為 virtual 並在乙個或多個派生類中被重新定義的成員函式,可實現函式成員的動態過載。
純虛函式: 純虛函式是一種特殊的虛函式,在許多情況下,在基類中不能對虛函式給出有意義的實現,而把它宣告為純虛函式,它的實現留給該基類的派生類去做。含有純虛函式的類被稱為抽象類(abstract class)
虛函式:virtual 《函式返回型別》< 函式名》(《參數列》) ;
純虛函式:virtual 《函式返回型別》《函式名》(《參數列》)=0;
1.虛函式可以直接使用,也可以在子類中過載以多型的形式呼叫,但純虛函式在基類中只有宣告沒有定義,所以只能在子類中實現了該函式才可以以多型的形式呼叫。
2.虛函式在子類中可以不被過載,但是純虛函式必須在子類中實現。
3.包含純虛函式的類成為抽象類,這種類不能宣告物件,只是作為基類為派生類服務。除非在派生類中完全實現基類中所有的的純虛函式,否則,派生類也變成了抽象類,不能例項化物件。
例題一(函式執行順序)
下面這段**會列印出什麼?
class a
~a()
};class b
~b()
};class c: public a, public b
~c()
};int main()
正確答案: a 你的答案: b (錯誤)
(a) a b c dea
(b) c a b dea
(c) a b c dec
(d) c a b dec
解析:建構函式的執行先執行父類,再執行子類。析構函式的執行順序相反,a b的析構函式不是虛函式,所以不會執行子類的虛函式。
例題二(函式執行順序)
解析:
1.當派生類中不含物件成員時
在建立派生類物件時,建構函式的執行順序是:基類的建構函式→派生類的建構函式;
析構函式相反。
2.當派生類中含有物件成員時
在定義派生類物件時,建構函式的執行順序:基類的建構函式→物件成員的建構函式→派生類的建構函式;
析構函式相反。
例題三(虛函式呼叫順序)
解析:建立乙個類物件c,然後動態型別轉換,讓乙個b *b1指標指向c,再一次動態型別轉換,讓乙個基類a *a2指標指向b1,當delete a2時,呼叫析構函式,但是基類a的析構函式不是虛函式,所以只呼叫a的析構函式,結果應該是:~a()
動態的多型通過虛函式實現,基類指標指向派生類的物件,若指標呼叫的函式派生類中存在,且在基類中宣告為虛函式,則呼叫的函式是派生類中的函式。 析構函式總是要宣告為虛函式,這樣析構時,先呼叫派生類的析構函式,再呼叫基類的析構函式,防止記憶體造成洩露 。a類的析構函式未宣告為虛函式,所以a類的指標,只可以呼叫a類的析構函式
例題四(純虛函式)
解析:純虛函式格式:virtual 《型別》 《函式名》 (《參數列》) = 0;
C 中建構函式 虛函式 析構函式的執行順序
include using namespace std class a virtual void func 第七步 執行類a的析構函式,輸出 析構函式a a virtual void fund class b public a 第四步 執行主函式裡的c.fun 輸出 開始.並呼叫func 由於fun...
建構函式與析構函式執行順序及其與虛函式關係
1.建構函式與析構函式執行順序 1 繼承類首先從基類建構函式開始執行,然後呼叫成員物件的建構函式,最後呼叫自己的建構函式 中間可能存在多個層次 2 析構函式的執行順序與建構函式相反,析構函式呼叫之後會呼叫成員物件的析構函式 3 成員物件的構造順序是宣告順序,不是建構函式的初始化列表順序,這樣可以保證...
C 虛基類建構函式的執行順序
1 呼叫基類的建構函式,多個基類則按派生類宣告時 列出的次序 從左到右呼叫,而不是初始化列表中 的次序。2 呼叫物件成員 子物件 的建構函式,按類宣告中 物件成員出現的次序呼叫,而不是初始化列表中的 次序。3 執行派生類的建構函式。同一層中對虛基類建構函式的呼叫總是先於普通基類的構 造函式。incl...