虛函式與多型

2021-08-21 01:31:40 字數 1768 閱讀 9656

基類的指標

因當建立乙個類的物件時會建立它的父類物件

.如下**:

class animal ;

class human : public animal ;

class mm : public human ;

animal *a = new mm; //基類的指標指向派生類物件

human *h = new mm; //父類的指標指向子類物件

.因父類

/基類是比子類

/派生類的空間小,所以基類的指標可以指向它的派生類的物件

.派生類的指標不可以指向父類

/基類的物件

,因派生類指標可訪問的範圍大

2. 通過父類指標**子類物件空間的問題.

class animal

~animal()

};class human : public animal

~human()

};int main(void)

編譯執行後的輸出:

[root@localhost 12multi-stats]# ./a.out

animal init

human init

animal exit

發現通過父類指標**子類物件時子類的析構函式沒有得到觸發

.解決這個問題,只要把基類的建構函式宣告為

virtual函式

.通常情況下,基類的析構函式都是宣告為虛函式的.

3. 函式重寫

如下面,父類子類都實現了乙個

eat函式,當通過子類物件來呼叫函式時,使用子類裡的函式。但父類的函式也是存放的

,也可以指定呼叫父類裡的函式

.using namespace std;

class animal

};class human : public animal

};int main(void)

4. 虛函式的作用

class animal

};class human : public animal

};int main(void)

當**執行時,會發現呼叫的其實是父類的

eat函式

,但從合理來說,父類指標指向的是子類的物件,應是呼叫子類重新實現的函式

.要想呼叫到子類新實現的函式,只需把父類裡的同名函式宣告為

virtual即可

.虛函式的作用就是通過基類指標提供一種方法,可以呼叫到派生類裡新實現的函式功能。實現**往後相容的目的。也是可以實現先寫好框架,這框架不管後面怎樣的擴充套件,都可以不用改變的

.虛函式是函式體,純虛函式其實就沒有函式體的虛函式

.用於指定派生類裡必須要實現的函式

.純虛函式:

class animal

5. 多類其實就是使用虛函式實現的功能.

例如,寫個遊戲的副本

:class role

};寫好副本後,不管什麼樣的角色,只要繼承了

role,實現虛函式,當呼叫

play進入副本時都可以得到呼叫

.而且不管繼承多少層,都是可以相容的

class magician : public role

void jump()

};class knight : public role

void jump()

};class superknight : public knight

void jump()

};int main(void)

本文由廣州尚觀科技發布。

虛函式與多型

前三者為靜態繫結,虛函式為動態繫結 動態繫結 只有通過基類指標或引用呼叫虛函式才能引發動態繫結 虛函式不能被宣告為靜態 include using namespace std class base virtual void fun2 void fun3 class derived public ba...

虛函式與多型

多型性 呼叫同乙個函式名,可以根據需要實現不同的功能。虛函式 可以在程式執行時通過呼叫相同的函式名而實現不同功能的函式稱為虛函式。編譯時的多型性 函式過載 執行時的多型性 虛函式 執行時的多型性是指在程式執行之前,根據函式名和引數無法確定應該呼叫哪乙個函式,必須在程式的執行過程中,根據具體的執 況來...

虛函式與多型

多型性 c 支援兩種多型性 編譯時多型性,執行時多型性 虛函式 派生類可以不顯式地用virtual宣告虛函式,這時系統就會用以下規則來判斷派生類的乙個函式成員是不是虛函式 一般習慣於在派生類的函式中也使用virtual關鍵字,以增加程式的可讀性 該函式是否與基類的虛函式有相同的名稱 引數個數及對應引...