回覆列表
-
1 # hhhnd28005
-
2 # 我是阿嘛
可以讓成員函式操作一般化,用基類的指標指向不同的派生類的物件時,
基類指標呼叫其虛成員函式,則會呼叫其真正指向物件的成員函式,
而不是基類中定義的成員函式(只要派生類改寫了該成員函式)。
若不是虛擬函式,則不管基類指標指向的哪個派生類物件,呼叫時都
會呼叫基類中定義的那個函式。
可以讓成員函式操作一般化,用基類的指標指向不同的派生類的物件時,
基類指標呼叫其虛成員函式,則會呼叫其真正指向物件的成員函式,
而不是基類中定義的成員函式(只要派生類改寫了該成員函式)。
若不是虛擬函式,則不管基類指標指向的哪個派生類物件,呼叫時都
會呼叫基類中定義的那個函式。
C++中虛擬函式的作用:1、為了方便使用多型特性,我們常常需要在基類中定義虛擬函式。2、在很多情況下,基類本身生成物件是不合情理的。例如,動物作為一個基類可以派生出老虎、孔雀等子類,但動物本身生成物件明顯不合常理。為了解決上述問題,引入了純虛擬函式的概念,將函式定義為純虛擬函式(方法:virtual ReturnType Function()= 0;),則編譯器要求在派生類中必須予以重寫以實現多型性。同時含有純虛擬函式的類稱為抽象類,它不能生成物件。這樣就很好地解決了上述兩個問題。C++中虛擬函式的用法:比如你有個遊戲,遊戲裡有個虛基類叫「怪物」,有純虛擬函式 「攻擊」。然後派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函式,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來。然後出現好多怪物的時候就可以定義一個 虛基類指標陣列,把各種怪物的指標給它,然後迭代迴圈的時候直接 monster[i]->attack() 攻擊玩家就行了,大概見下圖:使用虛擬函式的注意事項:一、包含虛擬函式的類指標列表會增大。二、虛解構函式解構函式的作用是在物件撤銷之前做必要的“清理現場”的工作。當派生類的物件從記憶體中撤銷的時候,會先先呼叫派生類的解構函式然後再呼叫基類的解構函式。當我們new一個臨時物件時,若基類中包含解構函式,並且定義了一個指向該基類的指標變數。三、建構函式不能宣告為虛擬函式建構函式不能宣告為虛擬函式。如果宣告為虛擬函式,編譯器會自動報出。四、不在析構或者構造過程中呼叫虛擬函式在解構函式或者是建構函式中,我們絕對不能呼叫虛擬函式。即使,我們在建構函式或者解構函式中呼叫虛擬函式,也不會下降至派生類中呼叫函式。