1. 程式人生 > >派生類的建構函式和解構函式和多繼承中的二義性與虛擬函式

派生類的建構函式和解構函式和多繼承中的二義性與虛擬函式

解構函式主要作用是對資料成員初始化。

1派生類的建構函式

派生類的建構函式定義的一般形式為:

派生類名::派生類名(基類所需形參,本類成員所需形參):基類1(基類1 引數表),基類2(基類2 引數表),···,基類n(基類n 引數表),物件成員1(物件1 引數表),物件成員2(物件2 引數表),···,物件成員m(物件m 引數表){

 

                       //本類基本型別資料成員初始化

}

 

如果使用基類無參建構函式,派生類建構函式形參表中不包含供給基類建構函式的引數。此時,系統會呼叫基類的預設建構函式。如果使用物件資料成員的無參建構函式,派生類建構函式形參表中不包含初始化物件資料成員的引數。

2派生類的解構函式

派生類不能繼承基類的解構函式,需要自己定義解構函式,以便在派生類物件消亡之前進行必要處理。派生類的解構函式只負責清理它新定義的非物件資料成員,物件資料成員由物件所屬類的解構函式負責析構,基類的清理工作由基類的解構函式負責。

 

 

4多繼承中的二義性與虛擬函式

4.1多繼承的二義性

例,基類base

的成員(資料成員和成員函式),要被繼承到Fderiver1Fderiver2,然後又被繼承到派生類Sderiver。在派生類Sderiver中,基類base的成員有兩份拷貝(在Fderiver1Fderiver2中)。因此,通過派生類Sderiver的物件訪問基類base的公有成員時,編譯系統就不知道如何從兩份拷貝中進行選取,只好給出“ambiguous”的錯誤資訊,也就出現了二義性。

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 引數表)

在包含虛基類的繼承結構中,系統在建立派生類的物件時,呼叫建構函式的順序如下。

①按照虛擬基類被繼承的順序,呼叫它的建構函式。

②按照非虛擬基類被繼承的順序,呼叫它的建構函式。

③按照物件資料成員宣告的順序,呼叫它的建構函式。

④執行派生類自己的建構函式。