虛函式和多型

2021-08-15 07:16:42 字數 2213 閱讀 9305

一   虛函式:在類的成員函式前面加上virtual關鍵字,則這個成員函式稱為虛函式

注意:只有類成員函式加virtual才能稱為虛函式,普通函式不可以

二   虛函式的重寫:在子類定義了乙個與父類完全相同的虛函式時,則稱子類的這個函式重寫(覆蓋)了父類的這個虛函式

三   多型的兩個條件:1.虛函式重寫(覆蓋 )    兩個要求(1)虛函式   (2)函式全都相同(引數,函式名,返回值)

2.父類的指標或引用調虛函式

注意:重寫時子類的virtual可以不用寫,預設繼承了虛函式屬性(但是父類的必須要寫)

看如下**分析執行結果  

四   一些結論規則及其講解

1.派生類重寫基類的虛函式實現多型,要求函式名,引數列表,返回值完全相同(協變除外)

協變是什麼呢,指返回值可以不同(分別為父,子類指標引用)

2.只有類的成員函式才可以定義為虛函式

3.靜態成員函式不能定義為虛函式

4.如果在類外定義虛函式,只能在宣告時加virtual,類外定義函式時不能加virtual

5.建構函式不能為虛函式

原因:虛函式是物件創造出來由物件才調的,建構函式說明物件還在初始化,建立的乙個階段。因此不可以。

6.雖然可以將operator=定義為虛函式,但是最好不要將其定義為虛函式,因為使用時容易引起混淆。

解釋:成員函式裡面子類operator=是乙個合成版本,合成版本也就是說子類賦值時只賦值子類的,父類的不管

去呼叫父類的去賦值,這時就有乙個問題,你如果把它定義為虛函式,構成多型的行為,就可能導致一                  個死迴圈

7.不要在建構函式和析構函式裡面呼叫虛函式,在建構函式和析構函式中物件是不完整的,可能會發生未定義的行   為。

因為虛函式有可能調到子類,子類有可能沒有初始化,有可能已經析構了,因此出錯

class a

a(const a& a)

virtual void f()const

protected:

int* _pa;

};class b:public a

b(const b& b)

:a(b)

virtual void f()const

protected:

int* _pb;

};int main()

8.最好把基類的析構函式定義為虛函式。(另外析構函式比較特殊,因為派生類的析構函式跟基類的析構函式名稱不一樣,但仍是構成覆蓋,因為編譯器在這裡做了特殊處理)可以認為函式名是相同的

原因:

四  純虛函式

在成員函式的形參後面加上=0,則成員函式為純虛函式,包含純虛函式的類叫做抽象類(也叫介面類),抽象類不能例項化出物件,

純虛函式在派生類中重新定義以後,派生類才能例項化出物件

多型和虛函式

在c 中,多型是通過虛函式實現的。基類如果把乙個函式宣告為虛的 virtual 就表明繼承類可以覆蓋 override 這個函式 從而表現不同的行為,呈現出多型性 對於每乙個有虛函式的類,或者覆蓋了乙個或多個基類虛函式的繼承類,可認為有乙個與之關聯的虛函式表 v table v table 表中的每...

虛函式和多型

虛函式的概念 在類的成員函式前加virtual關鍵字,這個成員函式稱為虛函式。虛函式重寫 當在子類的定義了乙個與父類完全相同的虛函式時,則稱子類的這個函式重寫 也稱覆蓋 了父類的這個虛函式。include using namespace std class person public virtual...

虛函式和多型

pragma once 普通飛機 class plane include plane.h include using namespace std void plane fly void plane land pragma once include plane.h 直公升飛機 class jet pu...