1、基本形式:
virtual
returntype function_1();
//虛函式宣告
virtual returntype function_2() = 0;
//純虛函式宣告
先講示例吧,再總結結論。
2、示例:
classanimail
這段**的輸出結果是什麼呢?起初我認為是:animail::function_1()與dog::function_1(), 因為第一次輸出是引用基類animail的例項,第二次輸出是引用子類dog的例項。事實上答案是animail::function_1()與 animail::function_1(),為什麼呢?
這裡我們需要明白:
你就記住,不管引用的例項是哪個類的,當你呼叫的時候,系統會呼叫左值那個物件所屬類的方法。比如說 上面的**類animail和 dog都有乙個function_1函式,因為p是乙個animail類的指標,所以不管你將p指標指向類animail或是類dog,最終呼叫的函式都是類animail的function_1函式。這就是
靜態聯篇
,編譯器在編譯的時候就已經確定好了。可是如果我想實現跟據例項的不同來動態決定呼叫哪個函式呢?這就須要用到
虛函式(也就是動態聯篇)
。class
animail;
class
dog: public animail;
在基類的成員函式前加關鍵字virtual,則表示這個函式是乙個
虛函式。
所謂虛函式
就是在編譯的時候不確定要呼叫哪個函式,而是動態決定將要呼叫哪個函式。它的作用就是為了能讓這個函式在它的子類裡面可以被過載,這樣的話,編譯器就可以使用後期繫結來達到多型了,也就是:用基類的指標來呼叫子類的這個函式。
要實現虛函式必須保證派生類的函式名與基類相同,引數名引數型別等也要與基類相同。
但派生類中的virtual關鍵字可以省略,也表示這是乙個虛函式。
下面來分析一下**,宣告乙個基類的指標(必須是基類,反之則不行)p,把p指向類animail的例項canimail,呼叫function_1函式,這時系統會判斷p所指向的例項的型別,如果是animail類的例項就呼叫animail類的function_1函式,如果是dog類的例項cdog就呼叫dog類的function_1函式。
下面來講一下純虛函式,包含純虛函式的類也可叫虛基類或者抽象類:
class
animail;
classdog: public animail;
};class
pig: public animail;
如上**,定義了乙個動物類(animail),類中有一函式getcolor可取得動物顏色,但動物有很多很多種,顏色自然無法確定,所以就把它宣告為純虛函式,也就是光宣告函式名不去定義(實現)它,類dog繼承了animail並實現了裡面的**,返回黃色。bike類同樣道理。有一點須要注意一下,
純虛函式不能例項化,但可以宣告指標
,所以上面的main函式中: animail canimail; 編譯器會告訴你:由於它的成員的原因,無法instantiate 抽象類animail,並且警告你getcolor()
沒有定義。
虛函式1, 虛函式是非靜態的、非內聯的成員函式。
2, 若類中乙個成員函式被說明為虛函式,則該成員函式在派生類中可能有不同的實現。當使用該成員函式操作指標或引用所標識的物件時,對該成員函式呼叫可採用動態聯編。
5, 定義了虛函式後,程式中宣告的指向基類的指標就可以指向其派生類。在執行過程中,該函式可以不斷改變它所指向的物件,呼叫不同版本的成員函式,而且這些動作都是在執行時動態實現的。虛函式充分體現了物件導向程式設計的動態多型性。
純虛函式
1, 當在基類中不能為虛函式給出乙個有意義的實現時,可以將其宣告為純虛函式,其實現留待派生類完成。
2, 純虛函式的作用是為派生類提供乙個一致的介面,它只是個函式的宣告而已,它告訴編譯器,在這個類中的這個純虛函式是沒有函式定義的,該類不能建立物件(即不能例項化),但可以宣告指標,該類的派生類負責給出這個虛函式的過載定義。
虛函式與純虛函式
1 基本形式 virtual returntype function 1 虛函式宣告 virtual returntype function 2 0 純虛函式宣告 先講示例吧,再總結結論。2 示例 classanimail 這段 的輸出結果是什麼呢?起初我認為是 animail function 1...
虛函式與純虛函式
參考 虛函式 比如 virtual void function1 virtual關鍵字修飾的 成員函式 就是虛函式。把基類的成員函式 設為virtual,其 派生類的相應的函式也會自動變為虛函式。指向 基類的指標在操作它的 多型類物件時,會根據不同的類物件,呼叫其相應的函式,這個函式就是虛函式。純虛...
虛函式與純虛函式
在c 中虛函式是實現多型的一種機制,核心理念就是通過基類訪問派生類定義的函式。最常見的例子就是如下 class a class b public a int main void 這裡函式foo通過關鍵字virtual宣告為了虛函式,主函式中定義了乙個父類a的指標a,指向乙個子類b,此時再用a去呼叫f...