派生類的建構函式和解構函式和多繼承中的二義性與虛擬函式
解構函式主要作用是對資料成員初始化。
1派生類的建構函式
派生類的建構函式定義的一般形式為:
派生類名::派生類名(基類所需形參,本類成員所需形參):基類1(基類1 引數表),基類2(基類2 引數表),···,基類n(基類n 引數表),物件成員1(物件1 引數表),物件成員2(物件2 引數表),···,物件成員m(物件m 引數表){
//本類基本型別資料成員初始化
}
如果使用基類無參建構函式,派生類建構函式形參表中不包含供給基類建構函式的引數。此時,系統會呼叫基類的預設建構函式。如果使用物件資料成員的無參建構函式,派生類建構函式形參表中不包含初始化物件資料成員的引數。
2派生類的解構函式
派生類不能繼承基類的解構函式,需要自己定義解構函式,以便在派生類物件消亡之前進行必要處理。派生類的解構函式只負責清理它新定義的非物件資料成員,物件資料成員由物件所屬類的解構函式負責析構,基類的清理工作由基類的解構函式負責。
4多繼承中的二義性與虛擬函式
4.1多繼承的二義性
例,基類base
4.2虛基類
可以解決二義性問題。
將共同基類設定為虛基類的方法是,在定義第一級派生類時用關鍵字virtual修飾說明繼承關係,其語法形式為
Class 派生類名:virtual 繼承方式 基類名
//···
};
對第二級派生類的建構函式要進行一下修改:
建構函式在類外:
派生類名::派生類名(基類所需形參,本類成員所需形參):基類(data):基類1(基類1 引數表),基類2(基類2 引數表),···,基類n(基類n 引數表),物件成員1(物件1 引數表),物件成員2(物件2 引數表),···,物件成員m(物件m 引數表)
建構函式在類內:
派生類名(基類所需形參,本類成員所需形參):基類(data):基類1(基類1 引數表),基類2(基類2 引數表),···,基類n(基類n 引數表),物件成員1(物件1 引數表),物件成員2(物件2 引數表),···,物件成員m(物件m 引數表)
在包含虛基類的繼承結構中,系統在建立派生類的物件時,呼叫建構函式的順序如下。
①按照虛擬基類被繼承的順序,呼叫它的建構函式。
②按照非虛擬基類被繼承的順序,呼叫它的建構函式。
③按照物件資料成員宣告的順序,呼叫它的建構函式。
④執行派生類自己的建構函式。