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

來源:互聯網
上載者:User

標籤:函數   動態   其他   刪除   保留   運行時   virt   直接   類對象   

一、C++多態

C++的多態包括靜態多態和動態多態。靜態多態包括函數重載和泛型程式設計,動態多態包括虛函數。靜態多態是指在編譯期間就可以確定,動態多態是指在程式運行時才能確定。

二、虛函數

1、虛函數為類的非靜態成員函數,存取權限一般為public。函式宣告時,在傳回值前加virtual關鍵字,函數定義時不需要加virtual。父類定義的虛函數,子類在繼承時,可以對虛函數重新定義,當然子類的函數應該與父類虛函數一樣,只是函數實現不一樣。我們用父類的指標指向子類的執行個體,然後通過父類的指標可以調用實際子類的成員函數。

2、建構函式不能為虛函數

3、當基類中有虛函數的時候,一般基類的解構函式也要定義為虛解構函式。如果不定義虛解構函式,當刪除一個指向衍生類別對象的指標時,會調用基類的解構函式,衍生類別的解構函式未被調用,造成記憶體流失。定義虛解構函式後,最底層的衍生類別的解構函式最先被調用,然後各個基類的解構函式被調用。

三、純虛函數

純虛函數為虛函數在聲明時,函數末尾加=0,純虛函數沒有函數定義,它的子類需要繼承所有基類的純虛函數並且給出定義。純虛函數的作用就是為衍生類別提供一個一致的介面。

四、抽象類別

抽象類別就是指含有純虛函數的類,該類不能建立對象,但是可以聲明指標和引用。

五、虛基類

1、如果一個衍生類別有多個直接基類,而這些直接基類又有一個共同的基類,則在最終的衍生類別中會保留該間接共同基類資料成員的多份同名成員。在引用這些同名的成員時,必須在衍生類別對象名後增加直接基類名,以避免二義性。

樣本:

class A
{

public:

int m_nNum;

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

class D :public B,public C 
{
};

D d1;

d1.A::m_nNum;

2、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;

3、在最後的衍生類別中不僅要負責對直接基類進行初始化,還要負責對虛基類初始化。C++編譯系統只執行最後的衍生類別對虛基類的建構函式的調用,而忽略虛基類的其他衍生類別(B和C)對虛基類的建構函式的調用,保證了虛基類成員不會被多次初始化。

例如:

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

構造的順序為先構造最上層基類,然後父類誰先繼承誰先構造,解構函式的順序和建構函式順序相反。

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.