**:360 圖書館
2011-09-24 09:30
構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。
如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。
構造原則如下:
1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。
2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。
3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。
4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。
5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。
6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式,比如:
#include
class animal
;當然,類中普通的成員變數也可以採取此種方式進行初始化,然而,這就沒有必要了。
上面都提到了顯式呼叫父類的建構函式,那如何才能顯式呼叫呢?
1, 如果這樣寫子類的建構函式
fish():animal(400,300)
…這種方法,適合子類一開始就擁有固定的屬性值。即 執行 fish obj;後這條魚的高和寬就固定為 300 和400了。
2. 如果這樣寫子類的建構函式
子類要顯式呼叫父類的有參的建構函式,子類自己頁需要重寫乙個帶參的建構函式。所以,
先在在子類的.h裡宣告,fish(int height,int width);
在子類的.cpp裡加上實現函式如下:
fish(int height,int width):animal(height,width)
checklocation::checklocation(void) //預設建構函式。
checklocation::checklocation(string str) //case 2 在這裡顯式呼叫基類的建構函式。但編譯失敗。
checklocation::checklocation(string str):check_base(string str) //case 3 在這裡顯式呼叫基類的建構函式。失敗。
checklocation::checklocation(string str):check_base(str) //case 4 在這裡顯式呼叫基類的建構函式。成功。
{其中,case3 和case 4 的區別要小心。
必須注意,關於 子類的建構函式怎麼寫、組合類的建構函式怎麼寫,請看:
《c++建構函式的剖析 》 包冬梅
在C 中子類繼承和呼叫父類的建構函式方法
構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承 子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法 因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅...
在C 中子類繼承和呼叫父類的建構函式方法
構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承 子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法 因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅...
在C 中子類繼承和呼叫父類的建構函式方法
如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。構造原則如下 1.如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。2.如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執...