c++之哪些成員函數不能被繼承

C++中,並不是所有的成員函數都能被子類繼承,有三類成員函數不能被子類繼承,分別是:構造函數(包括拷貝構造)、析構函數、賦值運算符重載函數。

一,構造函數   

構造方法用來初始化類的對象,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變量和成員方法,但不繼承父類的構造方法)。因此,在創建子類對象時,爲了初始化從父類繼承來的數據成員,系統需要調用其父類的構造方法。   如果沒有顯式的構造函數,編譯器會給一個默認的構造函數,並且該默認的構造函數僅僅在沒有顯式地聲明構造函數情況下創建。 構造原則如下:

1. 如果子類沒有定義構造方法,則調用父類的無參數的構造方法。

2. 如果子類定義了構造方法,不論是無參數還是帶參數,在創建子類的對象的時候,首先執行父類無參數的構造方法,然後執行自己的構造方法。

3. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數,則會調用父類的默認無參構造函數。

4. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數且父類自己提供了無參構造函數,則會調用父類自己的無參構造函數。

5. 在創建子類對象時候,如果子類的構造函數沒有顯示調用父類的構造函數且父類只定義了自己的有參構造函數,則會出錯(如果父類只有有參數的構造方法,則子類必須顯示調用此帶參構造方法)。

6. 如果子類調用父類帶參數的構造方法,需要用初始化父類成員對象的方式 。

構造函數不能爲虛:

虛函數的作用是允許在派生類中重新定義與基類同名的函數,並且可以通過基類指針或引用來訪問基類和派生類中的同名函數

要成爲虛函數必須滿足兩點,一就是這個函數依賴於對象調用,因爲虛函數就是依賴於對象調用,因爲虛函數是存在於虛函數表中,有一個虛函數指針指向這個虛表,所以要調用虛函數,必須通過虛函數指針,而虛函數指針是存在於對象中的。二就是這個函數必須可以取地址,因爲我們的虛函數表中存放的是虛函數函數入口地址,如果函數不能尋址,就不能成爲虛函數。構造函數內聯函數不可作爲虛函數。

二,析構函數   

析構函數也不會被子類繼承,只是在子類的析構函數中會調用父類的析構函數。

  • 如果沒有將基類的析構函數定義爲虛函數
    當基類指針指向子類對象時,如果基類的析構函數不是virtual,那麼子類的析構函數將不會被調用,子類的資源沒有正確是釋放,因此造成內存泄露

三,賦值運算符重載函數   

賦值運算符重載函數也不會被子類繼承,只是在子類的賦值運算符重載函數中會調用父類的賦值運算符重載函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章