加入有父類是這樣定義的:?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class
ca
ca(
int
k) ;
virtual
~ca()
void
output()
private
:
int
m;
};
注意a類裡面有乙個私有成員m.
假設有乙個子類是這樣定義的:
?
1
2
3
4
class
cb :
public
ca
};
顯然是錯誤的,b類不能夠直接訪問a類的成員m
這樣定義也是錯誤的:
?
1
2
3
4
class
cb :
public
ca
};
這樣實際上是在cb(int k)中構造了乙個ca類的臨時變數例項,函式執行完之後就沒有了。如果有:
?
1
2
3
4
5
6
7
cb b(2);
執行的結果是:
using
ca's constractor
using
ca's 2nd constractor, k is 2
using
ca's disconstractor
using
ca's disconstractor
這說明,先預設的呼叫ca()構造了乙個cb的例項,然後又宣告了乙個ca (2)的例項。
正確的方法是這樣的:?
1
2
3
4
5
6
7
class
cb:
public
ca
};
這就是在子類中顯示呼叫父類的建構函式。
-------------------------------------
構造方法用來初始化類的物件,與父類的其它成員不同,它不能被子類繼承(子類可以繼承父類所有的成員變數和成員方法,但不繼承父類的構造方法)。因此,在建立子類物件時,為了初始化從父類繼承來的資料成員,系統需要呼叫其父類的構造方法。
如果沒有顯式的建構函式,編譯器會給乙個預設的建構函式,並且該預設的建構函式僅僅在沒有顯式地宣告建構函式情況下建立。
構造原則如下:
1. 如果子類沒有定義構造方法,則呼叫父類的無引數的構造方法。
2. 如果子類定義了構造方法,不論是無引數還是帶引數,在建立子類的物件的時候,首先執行父類無引數的構造方法,然後執行自己的構造方法。
3. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式,則會呼叫父類的預設無參建構函式。
4. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類自己提供了無參建構函式,則會呼叫父類自己的無參建構函式。
5. 在建立子類物件時候,如果子類的建構函式沒有顯示呼叫父類的建構函式且父類只定義了自己的有參建構函式,則會出錯(如果父類只有有引數的構造方法,則子類必須顯示呼叫此帶參構造方法)。
6. 如果子類呼叫父類帶引數的構造方法,需要用初始化父類成員物件的方式,比如:?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include
class
animal
…
};
class
fish:
public
animal
…
};
void
main()
在fish類的建構函式後,加乙個冒號(:),然後加上父類的帶引數的建構函式。這樣,在子類的建構函式被呼叫時,系統就會去呼叫父類的帶引數的建構函式去構造物件。這種初始化方式,還常用來對類中的常量(const)成員進行初始化,如下面的**所示:?
1
2
3
4
5
6
7
8
class
point
;
當然,類中普通的成員變數也可以採取此種方式進行初始化,然而,這就沒有必要了。
C 子類顯示呼叫父類的建構函式
加入有父類是這樣定義的 view plain copy to clipboard print?class ca ca int k virtual ca void output private int m 注意a類裡面有乙個私有成員m.假設有乙個子類是這樣定義的 view plain copy to ...
子類與父類構造函式呼叫順序
子類的析構函式的呼叫順序,和子類的建構函式的呼叫順序相反!記住,相反即可。include include using namespace std classm m classn n classa a classb public a b private m m1 m m2 static n ms n ...
父類建構函式 子類建構函式
1.子類可以通過super關鍵字來顯式地呼叫父類的建構函式。2.當父類沒有提供無引數的建構函式時,子類也不可以有無參建構函式,且子類的建構函式中必須顯式的呼叫父類的建構函式 3.如果父類提供了無引數的建構函式,此時子類的建構函式就可以不顯式的呼叫父類的建構函式,預設呼叫父類的無參建構函式。4.只要父...