c++中,並不是所有的成員函式都能被子類繼承,有三類成員函式不能被子類繼承,分別是:建構函式(包括拷貝構造)、析構函式、賦值運算子過載函式。
一,建構函式
構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。 構造原則如下:
1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。
2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。
3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。
4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。
5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。
6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式 。
建構函式不能為虛:
虛函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。
要成為虛函式必須滿足兩點,一就是這個函式依賴於物件呼叫,因為虛函式就是依賴於物件呼叫,因為虛函式是存在於虛函式表中,有乙個虛函式指標指向這個虛表,所以要呼叫虛函式,必須通過虛函式指標,而虛函式指標是存在於物件中的。二就是這個函式必須可以取位址,因為我們的虛函式表中存放的是虛函式函式入口位址,如果函式不能定址,就不能成為虛函式。建構函式內聯函式不可作為虛函式。
二,析構函式
析構函式也不會被子類繼承,只是在子類的析構函式中會呼叫父類的析構函式。
三,賦值運算子過載函式
賦值運算子過載函式也不會被子類繼承,只是在子類的賦值運算子過載函式中會呼叫父類的賦值運算子過載函式。
C 繼承之成員繼承
一 子類繼承父類哪些成員?1.繼承的效果 子類繼承父類,也就意味著在子類中可以訪問到父類中定義的成員。那麼在父類中定義的成員 字段,屬性,方法 哪些在子類中可以訪問到,哪些訪問不到那?2.欄位 字段可以使用 private 和 public 進行修飾,但 80 的時候使用 private 修飾。pr...
哪些函式不能被宣告為虛函式
常見的不不能宣告為虛函式的有 普通函式 非成員函式 靜態成員函式 內聯成員函式 建構函式 友元函式。1 為什麼c 不支援普通函式為虛函式?普通函式 非成員函式 只能被overload,不能被override,宣告為虛函式也沒有什麼意思,因此編譯器會在編譯時邦定函式。2 為什麼c 不支援建構函式為虛函...
C 複習之哪些函式不能宣告為虛函式
什麼樣的函式不能宣告為虛函式?1 不能被繼承的函式。2 不能被重寫的函式。1.普通函式 普通函式不屬於成員函式,是不能被繼承的。普通函式只能被過載,不能被重寫,因此宣告為虛函式沒有意義。因為編譯器會在編譯時繫結函式。2.友元函式 友元函式不屬於類的成員函式,不能被繼承。對於沒有繼承特性的函式沒有虛函...