公有派生類對象可以當作基類對象使用,反之則不行;
派生類對象可以隱含的轉換爲基類對象
派生類對象可以初始化爲基類的引用
派生類的指針可以隱含轉換爲基類的指針
派生類構造函數
如果派生類不新增數據成員,可以通過繼承派生類構造函數;使用語句using B::B;B爲類名
如果不繼承基類構造函數,則:
派生類新增數據成員,由派生類構造函數初始化
繼承來的成員:自動調用積累構造函數初始化
派生類的構造函數需要給基類構造函數傳遞參數
多繼承派生類的構造函數初始化順序
首先在初始化列表調用基類構造函數:調用順序按繼承時聲明的順序(不是按照書寫的先後次序)
其次初始化派生類中的成員:按照派生類成員定義順序進行初始化
派生類的複製構造函數
- 複製構造函數只能接受一個參數,既用來初始化派生類定義的成員,也將被傳遞給基類的複製構造函數。
- 基類的複製構造函數形參類型是基類對象的引用,實參可以是派生類對象的引用
- 例如: C::C(const C &c1): B(c1) {…}
派生類的析構函數中不需要顯式的調用基類的析構函數,基類的析構函數將在派生類析構函數執行完後執行
作用域限定
當派生類與基類中有相同成員時:
- 若未特別限定,則通過派生類對象使用的是派生類中的同名成員。
- 如要通過派生類對象訪問基類中被隱藏的同名成員,應使用基類名和作用域操作符(::)來限定。
二義性問題
- 如果從不同基類繼承了同名成員,但是在派生類中沒有定義同名成員,“派生類對象名或引用名.成員名”、“派生類指針->成員名”訪問成員存在二義性問題
- 解決方式:用類名限定
虛基類
-
需要解決的問題
- 當派生類從多個基類派生,而這些基類又共同基類,則在訪問此共同基類中的成員時,將產生冗餘,並有可能因冗餘帶來不一致性
-
虛基類聲明
- 以virtual說明基類繼承方式
- 例:class B1:virtual public B
-
作用
- 主要用來解決多繼承時可能發生的對同一基類繼承多次而產生的二義性問題
- 爲最遠的派生類提供唯一的基類成員,而不重複產生多次複製
-
注意:
- 在第一級繼承時就要將共同基類設計爲虛基類。
虛基類及其派生類構造函數
- 建立對象時所指定的類稱爲最遠派生類。
- 虛基類的成員是由最遠派生類的構造函數通過調用虛基類的構造函數進行初始化的。
- 在整個繼承結構中,直接或間接繼承虛基類的所有派生類,都必須在構造函數的成員初始化表中爲虛基類的構造函數列出參數。如果未列出,則表示調用該虛基類的默認構造函數。
- 在建立對象時,只有最遠派生類的構造函數調用虛基類的構造函數,其他類對虛基類構造函數的調用被忽略。
多態:方法的行爲取決於調用該方法的對象,這種複雜行爲稱爲多態。
對於使用virtual關鍵字的方法的基類方法重定義說明:是用對象調用該方法時,根據對象選擇具體調用(是基類中的,還是在派生類中重定義的)對象時基類對象則調用基類方法,對象時派生類對象則調用配生類方法,當使用引用或指針調用該方法,則根據引用或指針指向對象的類型選擇具體調用那種方法。
總之一句話:如果在派生類中重定義基類中的方法,將基類方法聲明爲虛的,這樣程序將根據對象類型而不是引用或指針類型選擇方法的版本。
基類指針可以指向派生類對象,派生類指針不可以指向基類對象
舉個例子
有個people類是基類,成員有姓名和身份證號,有個派生類學生student,添加了成員學號,現在如果你說的這個情況成立student的指針----pt讓他指向people成員t,則t只有兩個成員變量,而*pt有3個,現在pt->學號這個變量在pt下是可以使用的,但它指向的實體卻沒有這個變量,所以出錯,於是C++直接就避免了這樣的隱式轉換
【1】