C++ 在繼承中使用virtual


使用virtual:如果方法是通過引用類型或指針而不是對象調用的,它將確定使用哪一種方法。如果沒有使用關鍵字irtual,程序將根據引用類型或指針類型選擇方法;如果使用了irtual,程序將根據引用或指針指向的對象的類型來選擇方法。對於一個函數ViewAcct()來說,如果ViewAcct()不是虛的,則程序的行為如下:
// behavior with non-virtual ViewAcct()
// method chosen according to reference type
Brass dom("Dominic Banker", 11224, 4183.45);
BrassPlus dot("Dorothy Banker", 12118, 2592.00);
Brass & b1_ref = dom;
Brass & b2_ref = dot;
b1_ref.ViewAcct();    // use Brass::ViewAcct()
b2_ref.ViewAcct();    // use Brass::ViewAcct()
引用變量的類型為Brass,所以選擇了Brass::ViewAccount()。
使用Brass指針代替引用時,行為將與此類似。
如果ViewAcct()是虛的,則行為如下:
// behavior with virtual ViewAcct()
// method chosen according to object
Brass dom("Dominic Banker", 11224, 4183.45);
BrassPlus dot("Dorothy Banker", 12118, 2592.00);
Brass & b1_ref = dom;
Brass & b2_ref = dot;
b1_ref.ViewAcct();    // use Brass::ViewAcct()
b2_ref.ViewAcct();    // use BrassPlus::ViewAcct()
這里兩個引用的類型都是Brass,但b2_ref引用的是一個BrassPlus對象,所以使用的是BrassPlus::ViewAcct()。使用Brass指針代替引用時,行為將類似。

虛析構函數:基類聲明了一個虛析構函數。這樣做是為了確保釋放派生對象時,按正確的順序調用析構函數。

3.演示虛方法的行為
假設要同時管理Brass和BrassPlus賬戶,如果能使用同一個數組來保存Brass和BrassPlus對象,將很有幫助,但這時不可能的。數組中所有元素的類型必須相同,而Brass和BrassPlus是不同的類型。然而,可以創建指向Brass的指針數組。這樣,每個元素的類型都相同,但由於使用的是公有繼承模型,因此Brass指針既可以指向Brass對象,也可以指向BrassPlus對象。因此,可以使用一個數組來表示多種類型的對象。這就是多態性。

4.為何需要虛析構函數
在程序清單13.10中,使用delete釋放由new分配的對象的代碼說明了為何基類應包含一個虛析構函數,雖然有時好像並不需要析構函數。如果析構函數不是虛的,則將紙雕用對應與指針類型的析構函數。對於程序清單13.10,這意味着只有Brass的析構函數被調用,即使指針指向的是一個BrassPlus對象。如果析構函數是虛的,將調用相應對象類型的析構函數。因此,如果指針指向的是BrassPlus對象,將調用BrassPlus的析構函數,然后自動調用基類的析構函數。因此,使用虛析構函數可以確保正確的析構函數序列被調用!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM