三. 虛函式使用技巧
3.1 private的虛函式
考慮下面的例子:
class a
private:
virtual void bar()
};class b: public a
};在這個例子中,雖然bar()在a類中是private的,但是仍然可以出現在派生類中,並仍然可以與public或者protected的虛函式一樣產生多型的效果。並不會因為它是private的,就發生a::foo()不能訪問b::bar()的情況,也不會發生b::bar()對a::bar()的override不起作用的情況。
這種寫法的語意是:a告訴b,你最好override我的bar()函式,但是你不要管它如何使用,也不要自己呼叫這個函式。
3.2 建構函式和析構函式中的虛函式呼叫
乙個類的虛函式在它自己的建構函式和析構函式中被呼叫的時候,它們就變成普通函式了,不「虛」了。也就是說不能在建構函式和析構函式中讓自己「多型」。例如:
class a
// 在這裡,無論如何都是a::foo()被呼叫!
~a() // 同上
virtual void foo();
};class b: public a
;void bar()
如果你希望delete a的時候,會導致b::foo()被呼叫,那麼你就錯了。同樣,在new b的時候,a的建構函式被呼叫,但是在a的建構函式中,被呼叫的是a::foo()而不是b::foo()。
3.3 多繼承中的虛函式 3.4 什麼時候使用虛函式
在你設計乙個基類的時候,如果發現乙個函式需要在派生類裡有不同的表現,那麼它就應該是虛的。從設計的角度講,出現在基類中的虛函式是介面,出現在派生類中的虛函式是介面的具體實現。通過這樣的方法,就可以將物件的行為抽象化。
以設計模式[2]中factory method模式為例,creator的factorymethod()就是虛函式,派生類override這個函式後,產生不同的product類,被產生的product類被基類的anoperation()函式使用。基類的anoperation()函式針對product類進行操作,當然product類一定也有多型(虛函式)。
另外乙個例子就是集合操作,假設你有乙個以a類為基類的類層次,又用了乙個std::vector來儲存這個類層次中不同類的例項指標,那麼你一定希望在對這個集合中的類進行操作的時候,不要把每個指標再cast回到它原來的型別(派生類),而是希望對他們進行同樣的操作。那麼就應該將這個「一樣的操作」宣告為virtual。
現實中,遠不只我舉的這兩個例子,但是大的原則都是我前面說到的「如果發現乙個函式需要在派生類裡有不同的表現,那麼它就應該是虛的」。這句話也可以反過來說:「如果你發現基類提供了虛函式,那麼你最好override它」。
附:c++中的虛函式和純虛函式用法
1.虛函式和純虛函式可以定義在同乙個類(class)中,含有純虛函式的類被稱為抽象類(abstract class),而只含有虛函式的類(class)不能被稱為抽象類(abstract class)。
2.虛函式可以被直接使用,也可以被子類(sub class)過載以後以多型的形式呼叫,而純虛函式必須在子類(sub class)中實現該函式才可以使用,因為純虛函式在基類(base class)
只有宣告而沒有定義。
3.虛函式和純虛函式都可以在子類(sub class)中被過載,以多型的形式被呼叫。
4.虛函式和純虛函式通常存在於抽象基類(abstract base class -abc)之中,被繼承的子類過載,目的是提供乙個統一的介面。
5.虛函式的定義形式:virtual ;純虛函式的定義形式:virtual = 0; 在虛函式和純虛函式的定義中不能有static識別符號,原因很簡單,被static修飾的函式在編譯時候要求前期bind,然而虛函式卻是動態繫結(run-time bind),而且被兩者修飾的函式生命週期(life recycle)也不一樣。
6.如果乙個類中含有純虛函式,那麼任何試圖對該類進行例項化的語句都將導致錯誤的產生,因為抽象基類(abc)是不能被直接呼叫的。必須被子類繼承過載以後,根據要求呼叫其子類的方法。
以下為乙個簡單的虛函式和純虛寒數的使用演示,目的是拋磚引玉!
#include
//father class
class virtualbase
;//sub class
class subvirtual :public virtualbase
;/* instance class and sample */
void main()
C 虛函式 純虛函式
1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...
C 虛函式 純虛函式
1.析構函式是否應為虛函式問題?2.成員函式的虛函式問題?3.析構函式是否可以為純虛函式問題?說明 僅在使用父類指標指向子類物件時有區別 當析構函式非虛函式時,使用父類指標指向子類物件,在析構時將不會呼叫子類析構函式 當析構函式是虛函式時,使用分類指標指向子類物件,在析構時會呼叫子類析構函式,且呼叫...
C 虛函式 純虛函式
include qdebug class animal void animal animal 即要實現基類animal的animal函式 假如在dog子類中沒有實現animal 函式,則會呼叫基類的animal 函式。即列印 what is the animal 假如在dog子類中實現了animal...