C 多型之虛函式

2021-09-11 08:28:11 字數 2783 閱讀 2374

問題:

用基型別的指標指向派生類物件時,通過這個指標來訪問該物件,這是會出現訪問到的只是從基類繼承來的同名成員。

解決方法:

在基類中將這個同名函式宣告為虛函式,這樣就可以通過基型別的指標,訪問不同派生類的物件產生不同的行為,從而實現執行過程的多型。

語法:

virtual 函式型別 函式名(形參表);

注意:

必須是非靜態的成員函式

只能出現在類定義中的函式原型宣告中,不能在成員函式實現的時候。

#include using namespace std;

class base1

;void base1::display() const

class base2:public base1

;void base2::display() const

class derived:public base2

;void derived::display() const

void fun(base1 *ptr)

int main()

說明:

通過基型別指標就可以訪問到指向物件的成員,在這裡派生類並沒有顯示出給出虛函式宣告,這時系統就會遵循下面三條規則來判斷派生類的乙個函式是不是虛函式:

與基類的虛函式是否有相同的名稱相同的引數個數相同的對應引數型別相同的換回值,滿足這三個條件自動確定為虛函式

在基類中將同名函式加上virtual輸入結果如下:

如果沒有在基類中加入virtual輸出如下:

這時沒有虛函式,通過基類的指標指向派生類,輸出都是一樣的。

注意:

(1)有時候需要呼叫基類中被覆蓋的函式,在執行派生類特有的操作,這時可以通過"基類名::函式名"來呼叫覆蓋的函式。

(2)派生類需要修改基類的行為,應該在基類中將相應的函式宣告為虛函式

在c++中不能宣告虛建構函式,但可以宣告虛析構函式。析構函式沒有型別,沒有引數。

宣告語法:

virtual ~類名();
乙個類的虛構函式是虛函式,那麼由它派生出來的析構函式都是虛函式。

虛函式例子:

#include using namespace std;

class base

;base::~base()

class derived:public base

;derived::derived()

derived::~derived()

void fun(base *b)

int main()

輸出結果:

通過輸出可以看到基類指標刪除派生類物件時呼叫的是基類的析構函式,派生類的析構函式並沒有執行,也就是說派生類物件中動態記憶體並沒有釋放。

解決辦法就是將析構函式宣告為虛函式,如下所示:

派生類的析構被呼叫,派生類的動態記憶體被正確釋放。

純虛函式是乙個在基類中宣告的虛函式,它在基類中沒有具體的操作內容,各派生類根據實際需要給出各自的定義。格式為:virtual 函式型別 函式名(參數列)=0;基類中仍然可以允許對純虛函式給出實現,但是即使給出實現,也必須由派生類來覆蓋,否則無法例項化。如果將析構函式宣告為純虛函式,必須給出它的實現,因為派生類的析構函式體執行完執行完後需要呼叫基類的純虛函式

抽象類是帶有純虛函式的類。抽象類不能例項化,也就是不能有物件,但可以定義乙個抽象類的指標和引用。通過指標或引用,就可以訪問派生類的物件,進而訪問派生類成員。

下面通過乙個程式說明:

#include using namespace std;

class base1 //基類定義

;void base1::display() const //實現

class base2:public base1 //公有派生定義

;void base2::display() const //實現

class derived:public base2

;void derived::display() const

void fun(base1 *ptr) //引數為指向基類物件的指標

int main()

通過公有派生而來的子類給出了純函式的具體實現,所以不是抽象類;

程式中派生類的虛函式沒有關鍵字virtual說明,因為他們與基類的純虛函式具有相同的名稱、引數及換回值,由系統自動判斷為虛函式。

C 之虛函式和多型

1.虛函式 簡單的說,虛函式就是在函式原型前加上virtual關鍵字。函式一旦被宣告為虛函式,即使類在改寫它的時候沒有將其宣告為虛函式,它從該點的繼承層次結構中仍然是虛函式。如果基類中乙個函式被宣告為虛函式,在若干子類中有著不同的實現,那麼我們在建立若干子類的不同物件時,可以用基類的指標或者引用來指...

多型之虛函式

虛函式實現執行時多型。虛函式宣告只出現在類定義函式原型宣告中,而不能在成員函式實現的時候。虛函式一般不宣告為內聯函式,因為虛函式訪問時需要動態繫結,而內聯函式是靜態的。virtual關鍵字可以省略,當基類中已經宣告了虛函式,那麼派生類中和基類同返回值,同名,同形參的函式即使沒有加virtual也可判...

C 多型,虛函式

在c 中可以用基類指標指向其派生類,如果乙個派生類繼承多個父類,那麼如何通過基類指標訪問同名的成員呢?如果基類a,基類b中都有函式fun 派生類在同時繼承a b後在記憶體中根據繼承的順序分配記憶體,例如在繼承列表中出現的是b,a,那麼b中的成員在a的之前,當我們用b的指標去訪問時候,編譯器便將指標指...