子類的建構函式必須對繼承而來的成員進行初始化
1.直接通過初始化列表或者賦值的方式進行初始
2.呼叫父類建構函式進行初始化
父類建構函式在子類中的呼叫方式
1.預設呼叫.適用無參建構函式和使用預設引數的建構函式
2.顯示呼叫.通過初始化列表進行呼叫,適用於所有父類的建構函式
例子:
class
child
:public parent
child
(string s)
:parent
("parameter to parent"
)/*顯示呼叫,通過初始化列表進行呼叫*/
}
看下面這個例子:
#include
#include
using
namespace std;
class
parent
parent
(string s)};
class
child
: parent
child
(string s)};
intmain()
結果:
parent (
)child(
)parent (
)child(string s): c1
因為child c,child c1(「c1」)都是隱式呼叫,呼叫父類無參建構函式或者預設引數的建構函式,而父類中只有parent()這個無參建構函式,所以先呼叫父類的無參建構函式再呼叫本類的建構函式
**改動:
class
child
: parent
child
(string s)
:parent
(s)}
;
結果:
sice@sice:~$ ./a.out
parent (
)child(
)parent(string s)c1
child(string s): c1
現在 child c1(「c1」)成了顯示呼叫,所以呼叫了父類的引數一致的建構函式,現在我們可以得出一套構造規則
構造規則:
子類物件在建立時會首先呼叫父類的建構函式
先執行父類建構函式再執行子類的建構函式
父類建構函式可以被隱式呼叫或者顯示呼叫
補充:物件建立時建構函式的呼叫順序
1.呼叫父類的建構函式
2.呼叫成員變數的建構函式
3.呼叫類自身的建構函式
例子:
#include
#include
using
namespace std;
class
object};
class
parent
:public object
parent
(string s)
:object
(s)}
;class
child
:public parent
child
(string s)
:parent
(s),
mo1(s +
"1")
,mo2
( s +
"2")};
intmain()
結果:
sice@sice:~$ ./a.out
object (string s)c1
parent(string s)c1
object (string s)c11
object (string s)c12
child(string s): c1
可以看出父類的呼叫最先,就是parent的建構函式,接著"客人"mo1(s + 「1」),mo2( s + 「2」),最後是自己的建構函式
析構函式的呼叫順序與建構函式相反
1.執行自身的析構函式
2.執行成員變數的析構函式
3.執行父類的析構函式
例子:
#include
#include
using
namespace std;
class
object
~object()
};class
parent
:public object
parent
(string s)
:object
(s)~
parent()
};class
child
:public parent
child
(string s)
:parent
(s),
mo1(s +
" 1"),
mo2(s +
" 2")~
child()
};intmain()
object(string s)
: cc
parent(string s)
: cc
object(string s)
: cc 1
object(string s)
: cc 2
child(string s)
: cc
~child(
) cc
~object(
): cc 2
~object(
): cc 1
~parent(
): cc
~object(
): cc
可以看出析構順序與構造順序對稱相反
要點:
子類物件在建立的時候需要呼叫父類建構函式進行初始化
先執行父類建構函式然後執行成員的建構函式
!!父類建構函式顯示呼叫需要在初始化列表中進行!!
子類物件在銷毀時需要呼叫父類析構函式進行清理
繼承中構造析構
在繼承中面臨乙個問題就是 我們的基類和派生類都有各自的建構函式和析構函式,那麼再例項化派生類成員的時候,這個構造析構的順序是怎麼樣的呢?class animal animal void setm int a 0 intgetage private int age 我們構造了個動物類,我們需要繼續構造...
繼承中的構造和析構函式
子類物件在建立時首先會呼叫父類的建構函式,在父類的建構函式執行結束後,再執行子類的建構函式。當父類的建構函式有引數時,需要在子類的初始化列表中顯示呼叫。析構函式的呼叫的先後順序與建構函式相反 結論 建構函式 先呼叫父類 再呼叫子類 析構函式 先呼叫子類 再呼叫父類 如下所示 include usin...
C 繼承中的構造和析構
在c 的繼承中,在子類物件構造時,需要呼叫父類建構函式對其繼承來的成員進行初始化,在子類進行析構時,需要呼叫父類的析構函式對其繼承來的成員進行清理,過程如下 1 子類物件在建立時會首先呼叫父類的建構函式 2 父類建構函式執行結束後,執行子類的建構函式 3 當父類的建構函式有引數時,需要在子類的初始化...