將基類的析構函式宣告為虛函式後,派生類的析構函式也會自動成為虛函式。這個時候編譯器會忽略指標的型別,而根據指標的指向來選擇函式;也就是說,指標指向哪個類的物件就呼叫哪個類的函式。pb、pd 都指向了派生類的物件,所以會呼叫派生類的析構函式,繼而再呼叫基類的析構函式。如此一來也就解決了記憶體洩露的問題。
純虛函式沒有函式體,只有函式宣告,在虛函式宣告的結尾加上=0,表明此函式為純虛函式。包含純虛函式的類稱為抽象類(abstract class)。之所以說它抽象,是因為它無法例項化,也就是無法建立物件。原因很明顯,純虛函式沒有函式體,不是完整的函式,無法呼叫,也無法為其分配記憶體空間。抽象類通常是作為基類,讓派生類去實現純虛函式。派生類必須實現純虛函式才能被例項化。
如果在乙個類中包含有虛函式,那麼在建立該類物件時就會額外的增加乙個陣列,陣列中的每乙個元素都是虛函式的入口位址,不過陣列和物件是分開儲存的,物件中包含了陣列的首位址,這個陣列就是虛函式表(virtual function table),簡寫為vtable。
例子:
#include
#include
using
namespace std;
class
people
virtual
void
eating()
string m_name;
int m_age;};
class
student
:public people
virtual
void
examing()
float m_score;};
class
senior
:public student
virtual
void
partying()
bool m_hasjob;};
intmain()
輸出:
people::display(
)student::display(
)senior::display(
)
各個類的物件記憶體模型如下所示:
輸出:
-------------------people物件------------------
people::display(
)people::eating(
)-------------------student物件------------------
student::display(
)people::eating(
)student::examing(
)-------------------senior物件------------------
senior::display(
)people::eating(
)student::examing(
)senior::partying(
)
剛好和上面的物件模型符合。 C 學習筆記23 虛函式和多型
虛函式 1 虛函式定義 在類的定義中,前面有virtual關鍵字的成員函式就是虛函式。class base 2 int base get virtual關鍵字只用在類定義裡的函式宣告中,寫函式體時不用。建構函式和靜態成員函式不能是虛函式 3 虛函式和普通函式差別 虛函式可以參與多型,而普通函式不可以...
C 學習摘要之四 虛函式和多型
多型性與前面提到的資料封裝和繼承性共同構成了物件導向程式設計的三個重要機制。1 靜態聯編與動態聯編 由於函式過載的存在,當程式中出現呼叫同名函式時,編譯器會根據函式的引數型別 個數決定呼叫執行哪乙個同名函式的 這種把乙個函式的呼叫與適當的函式實現 聯絡在一起的過程,叫做聯編。根據聯編的實現階段的不同...
C 學習摘要之四 虛函式和多型
第四章虛函式和多型 多型性與前面提到的資料封裝和繼承性共同構成了物件導向程式設計的三個重要機制。1 靜態聯編與動態聯編 由於函式過載的存在,當程式中出現呼叫同名函式時,編譯器會根據函式的引數型別 個數決定呼叫執行哪乙個同名函式的 這種把乙個函式的呼叫與適當的函式實現 聯絡在一起的過程,叫做聯編。根據...