C++多態、虛函數、純虛函數、抽象類、虛基類

1、C++多態

C++的多態包括靜態多態和動態多態。靜態多態包括函數重載和泛型編程,動態多態包括虛函數。靜態多態是指在編譯期間就能夠肯定,動態多態是指在程序運行時才能肯定。編程

2、虛函數

一、虛函數爲類的非靜態成員函數,訪問權限通常爲public。函數聲明時,在返回值前加virtual關鍵字,函數定義時不須要加virtual。父類定義的虛函數,子類在繼承時,能夠對虛函數從新定義,固然子類的函數應該與父類虛函數同樣,只是函數實現不同。咱們用父類的指針指向子類的實例,而後經過父類的指針能夠調用實際子類的成員函數。函數

二、構造函數不能爲虛函數指針

三、當基類中有虛函數的時候,通常基類的析構函數也要定義爲虛析構函數。若是不定義虛析構函數,當刪除一個指向派生類對象的指針時,會調用基類的析構函數,派生類的析構函數未被調用,形成內存泄漏。定義虛析構函數後,最底層的派生類的析構函數最早被調用,而後各個基類的析構函數被調用。對象

3、純虛函數

純虛函數爲虛函數在聲明時,函數末尾加=0,純虛函數沒有函數定義,它的子類須要繼承全部基類的純虛函數而且給出定義。純虛函數的做用就是爲派生類提供一個一致的接口。繼承

4、抽象類

抽象類就是指含有純虛函數的類,該類不能建立對象,可是能夠聲明指針和引用。接口

5、虛基類

一、若是一個派生類有多個直接基類,而這些直接基類又有一個共同的基類,則在最終的派生類中會保留該間接共同基類數據成員的多份同名成員。在引用這些同名的成員時,必須在派生類對象名後增長直接基類名,以免二義性。內存

示例:編譯

class A
{class

public:泛型

int m_nNum;

};
class B :public A
{…};
class C :public A
{…};

class D :public B,public C 
{
};

D d1;

d1.A::m_nNum;

二、C++提供虛基類,使得在繼承間接共同基類時只保留一份成員。

示例:

class A
{

public:

int m_nNum;

};
class B :virtual public A
{…};
class C :virtual public A
{…};

class D :public B,public C 
{
};

D d1;

d1.m_nNum;

三、在最後的派生類中不只要負責對直接基類進行初始化,還要負責對虛基類初始化。C++編譯系統只執行最後的派生類對虛基類的構造函數的調用,而忽略虛基類的其餘派生類(B和C)對虛基類的構造函數的調用,保證了虛基類成員不會被屢次初始化。

例如:

class D :public B,public C 
{
   D(int n):A(n),B(n),C(n){ }
};

構造的順序爲先構造最上層基類,而後父類誰先繼承誰先構造,析構函數的順序和構造函數順序相反。

相關文章
相關標籤/搜索