當函式被virtual關鍵字修飾時,該函式被稱為虛函式,虛函式是指乙個類中你希望過載的成員函式,當你用乙個基類指標或引用指向乙個繼承類物件的時候,你呼叫乙個虛函式,實際呼叫的是繼承類的版本。虛函式最關鍵的特點是「動態聯編」,它可以在執行時判斷指標指向的物件,並正確呼叫物件的函式。 而函式的過載可以認為是多型,只不過是靜態的。注意,非虛函式靜態聯編,效率要比虛函式高,但是不具備動態聯編能力。
只要基函式定義了virtual,繼承類的該函式也就具有virtual屬性
c++中的函式呼叫預設不適用動態繫結。要觸發動態繫結,必須滿足兩個條件:第一,指定為虛函式;第二,通過基類型別的引用或指標呼叫。
如果使用了virtual關鍵字,程式將根據引用或指標指向的物件型別 來選擇方法,否則使用引用型別或指標型別來選擇方法。
class a;
virtual void fun1();
virtual void fun2();
};class b : public a;
virtual void fun2();// 重寫了基類的方法
};int main
class cshape
;
何時使用純虛函式?(1)當想在基類中抽象出乙個方法,且該基類只做能被繼承,而不能被例項化;
(2)這個方法必須在派生類(derived class)中被實現;
如果滿足以上兩點,可以考慮將該方法申明為pure virtual function.
抽象類的規定
(1)抽象類只能用作其他類的基類,不能建立抽象類物件。
(2)抽象類不能用作引數型別、函式返回型別或顯式轉換的型別。
(3)可以定義指向抽象類的指標和引用,此指標可以指向它的派生類,進而實現多型性。
虛繼承是多重繼承中特有的概念。虛擬基類是為解決多重繼承而出現的。間接或直接地繼承同一基類,會在子類中存在多份拷貝。這樣將存在兩個問題:①浪費儲存空間;②存在二義性
例:類d繼承來自類b1、b2,而類b1、b2都繼承來自類a,如左圖所示(a為非虛基類):
為了節省記憶體空間,可以將b1、b2對a的繼承定義為虛繼承,那麼a就成了虛擬基類。如右圖所示。
class a{};
class b1 :public virtual a{};
class b2 :public virtual a{};
class d :public b1,public b2{};
C 學習筆記 關鍵字virtual 虛繼承
依舊是程設2的筆記 普通繼承與虛繼承,只有在派生類重複繼承某一基類時,才有區別。virtual可以使派生類在重複繼承乙個基類時,只產生唯一的乙份基類副本。如上圖,當b,c的繼承 為 class b virtual public a class c virtual public a 此時d只會繼承乙份...
虛函式中virtual關鍵字的使用問題
在c 中用到關鍵字virtual的一共有兩個部分 乙個是虛繼承,乙個是虛函式 今天主要講解虛函式中用到virtual的一些簡單部分。就當是加深記憶 1.在基類中宣告虛函式一定要用關鍵字 virtual 2.而如果虛函式的實現單獨來做,則不能用virtual關鍵字,否則會報錯。3.而在自類中對虛函式進...
不使用virtual關鍵字 模擬虛函式來表現多型性
不使用virtual關鍵字 模擬虛函式來表現出多型性 寫一基類person 有sayhello,saygoodbye函式 有一子類student 它也有自己的sayhello,saygoodbye函式 請在這兩個類裡加入函式 vsayhello,vsaygoodbye函式 來表現出物件的多型性 分別...