虛函式和多型

2021-08-04 08:53:26 字數 1356 閱讀 7374

虛函式的概念

在類的成員函式前加virtual關鍵字,這個成員函式稱為虛函式。

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

#include

using

namespace

std;

class person

public:

virtual

void buytickets()

};class student :public person

};void fun(person&p)

int main()

多型

當時用基類的指標或引用呼叫重寫的虛函式時,指向父類的的就是父類的虛函式,指向子類的就是子類的虛函式。

總結:

派生類重寫基類的虛函式構成多型要求函式名相同,返回值相同,引數相同(協變除外)。

在基類中定義了虛函式,在派生類中依舊保持虛函式的特性。

只有在類內才能定義虛函式,如果想在類外部定義虛函式,則需在類內部宣告虛函式,然後在類外部定義並且在外部定義時不加virtual。

靜態成員不能為虛函式。

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

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

最好把基類的析構函式宣告為虛函式。(why?另外析構函式比較特殊,因為派生類的析構函式跟基類的析構函式名稱不一樣,但 是構成覆蓋,這裡是因為編譯器做了特殊處理)

過載,重寫(覆蓋),重定義(隱藏)三者的區別

過載:在同一作用域,函式名相同,引數不同,返回值可以不同

重定義(隱藏):不在同一作用域,分別在基類和派生類,函式名相同

重寫(覆蓋):不在同一作用域,分別在基類和派生類,函式名相同,引數相同,返回值相同 訪問限定符可以不同,基類必須有virtual關鍵。

在基類和派生類的關係中,只要不構成重寫就構成重定義。

純虛函式

在虛函式的形參後加=0構成純虛函式,所在的類叫做抽象類,抽象類不能例項化物件。純虛函式在派生類中重新定義以後,派生類才能例項化出物件

//純虛函式

class person

};

友元關係不能繼承,基類定義了static成員,則整個繼承體系裡面只有乙個這樣的成員。無論派生出多少個子類,都只有乙個static成員例項。

多型和虛函式

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

虛函式和多型

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

虛函式和多型

定義 類的成員函式前面加virtual關鍵字 虛函式重寫 子類定義了乙個與父類完全角同的虛函式,子類的函式重寫 覆蓋 父類的虛函式 隱藏 作用域不同,注意 虛函式和虛繼承關鍵字一樣,但意義完全不同 多型 當使用基類的指標或引用呼叫重寫的虛函式時,當指向父類呼叫的就是父類的虛函式,指向子類呼叫的就是子...