虛函式與純虛函式

2021-07-11 05:07:24 字數 2158 閱讀 7614

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...