C 語言基礎 12 虛函式

2021-09-09 03:36:21 字數 2361 閱讀 6487

1.只需要在虛函式的宣告處加上 virtual 關鍵字,函式定義處可以加也可以不加。

2.為了方便,你可以只將基類中的函式宣告為虛函式,這樣所有子類中具有遮蔽(覆蓋)關係的同名函式都將自動成為虛函式。

3. 當在基類中定義了虛函式時,如果派生類沒有定義新的函式來遮蔽此函式,那麼將使用基類的虛函式。

4.只有子類的虛函式遮蔽基類的虛函式(函式原型相同)才能構成多型(通過基類指標訪問子類函式)。例如基類虛函式的原型為virtual void func();,派生類虛函式的原型為virtual void func(int);,那麼當基類指標 p 指向派生類物件時,語句p -> func(100);將會出錯,而語句p -> func();將呼叫基類的函式。

5.建構函式不能是虛函式。對於基類的建構函式,它僅僅是在派生類建構函式中被呼叫,這種機制不同於繼承。也就是說,派生類不繼承基類的建構函式,將建構函式宣告為虛函式沒有什麼意義。.

6.析構函式可以宣告為虛函式,而且有時候必須要宣告為虛函式。

#include using

namespace

std;

//基類base

class

base;

void

base::func()

void base::func(int

n)//

派生類derived

class derived: public

base;

void

derived::func()

void derived::func(char *str)

intmain()

注意:p -> func("");會出現編譯錯誤,因為子類derived中的 void func(char *)並未對父類中的virtual void func(int)造成覆蓋,兩個函式的函式原型不同,所以無法構造多型,自然也不能通過基類的指標來訪問子類函式。

先看下面的例子:

#include using

namespace

std;

//基類

class

base;

base::base()

base::~base()

//派生類

class derived: public

base;

derived::derived()

derived::~derived()

intmain()

執行結果:

base constructor

derived constructor

base destructor

-------------------

base constructor

derived constructor

derived destructor

base destructor

在本例中,不呼叫派生類的析構函式會導致 name 指向的 100 個 char 型別的記憶體空間得不到釋放;除非程式執行結束由作業系統**,否則就再也沒有機會釋放這些記憶體。這是典型的記憶體洩露

注意:

delete pb; 不呼叫子類的析構函式是因為:這裡的析構函式是非虛函式,通過指標訪問非虛函式時,編譯器會根據指標型別來確定要呼叫的函式;也就是說,指標指向哪個類

就呼叫哪個類的函式。pb是基類的指標,所以不管它指向的是基類的物件還是子類的物件,始終都是呼叫基類的析構函式

delete pd 會同時呼叫子類和基類的析構函式是因為:pd是子類的指標,編譯器會根據它的型別匹配到子類的析構函式,在執行子類的析構函式的過程中,又會呼叫基類的析構函式

子類的析構函式始終會呼叫基類的析構函式,且這個過程是隱式完成的

更改上面的**,將基類的析構函式宣告為虛函式:

class

base;

將基類的析構函式宣告為虛函式後,派生類的析構函式也會自動成為虛函式。這個時候編譯器會忽略指標的型別,而根據指標的指向來選擇函式;也就是說,指標指向哪個類的物件就呼叫哪個類的函式。pb、pd 都指向了派生類的物件,所以會呼叫派生類的析構函式,繼而再呼叫基類的析構函式。如此一來也就解決了記憶體洩露的問題。

當然了,這裡強調的是基類,如果乙個類是最終的類,那就沒必要再宣告為虛函式了。

C 語言基礎 例程 虛函式

賀老師的教學鏈結 本課講解 指向基類的指標,為何只能訪問來自基類成員?include include using namespace std 宣告基類student class student student類成員函式的實現 student student int n,string nam,floa...

C 虛函式 12 純虛析構函式

c 中析構函式能否為純虛函式?可以!c 中定義乙個純虛析構函式是合法的,並且最重要的一點是如果某個類包含純虛析構函式,則類必須給此函式定義函式體。看起來這種現象很奇怪,純虛函式怎麼會需要定義函式體呢?但是,因為析構函式的呼叫順序總是與構造順序相反,這就意味著派生類的析構總是先被呼叫,然後再呼叫基類的...

c 語言基礎 虛函式的概念

虛函式聯絡到多型,多型聯絡到繼承。所以本文中都是在繼承層次上做文章。沒了繼承,什麼都沒得談。下面是對c 的虛函式這玩意兒的理解。一,什麼是虛函式 如果不知道虛函式為何物,但有急切的想知道,那你就應該從這裡開始 簡單地說,那些被virtual關鍵字修飾的成員函式,就是虛函式。虛函式的作用,用專業術語來...