派生類都只有乙個基類,稱為單繼承。除此之外,c++也支援多繼承,即乙個派生類可以有兩個或多個基類。
多繼承的語法也很簡單,將多個基類用逗號隔開。
例如已宣告了類a、類b和類c,那麼可以這樣來宣告派生類d:
d 是多繼承形式的派生類,它以公有的方式繼承 a 類,以私有的方式繼承 b 類,以保護的方式繼承 c 類。d 根據不同的繼承方式獲取 a、b、c 中的成員,確定它們在派生類中的訪問許可權。class d: public a, private b, protected c
與單繼承形式基本相同,只是在派生類的建構函式中呼叫多個基類的建構函式。
以上面的 a、b、c、d 類為例,d 類建構函式的寫法為:
多繼承的例項d
(形參列表):a
(實參列表),b
(實參列表),c
(實參列表)
執行結果#include
using namespace std;
//基類
class basea
;basea:
:basea
(int a,
int b)
:m_a
(a),
m_b(b)
basea::~
basea()
//基類
class baseb
;baseb:
:baseb
(int c,
int d)
:m_c
(c),
m_d(d)
baseb::~
baseb()
//派生類
class derived: public basea, public baseb
;derived:
:derived
(int a,
int b,
int c,
int d,
int e)
:basea
(a, b)
,baseb
(c, d)
,m_e
(e)derived::~
derived()
void derived:
:show()
intmain()
從執行結果來看,多繼承形式下析構函式的執行順序和建構函式的執行順序相反。basea constructor
.baseb constructor
derived constructor
1,2,3,4,5
derived destructor
baseb destructor
basea destructor
當兩個或多個基類有同名成員時,如果直接訪問該成員,就會產生命名衝突,編譯器不知道使用哪個基類的成員。這個時候需要在名字前面加上類名和域解析符::,以顯示地指明到底使用哪個類的成員,消除二義性。
執行結果#include
using namespace std;
//基類
class basea
;basea:
:basea
(int a,
int b)
:m_a
(a),
m_b(b)
basea::~
basea()
void basea:
:show()
//基類
class baseb
;baseb:
:baseb
(int c,
int d)
:m_c
(c),
m_d(d)
baseb::~
baseb()
void baseb:
:show()
//派生類
class derived: public basea, public baseb
;derived:
:derived
(int a,
int b,
int c,
int d,
int e)
:basea
(a, b)
,baseb
(c, d)
,m_e
(e)derived::~
derived()
void derived:
:display()
intmain()
basea constructor
baseb constructor
derived constructor
m_a =
1m_b =
2m_c =
3m_d =
4m _e =
5derived destructor
baseb destructor
basea destructor
執行結果#include
using namespace std;
//基類a
class a;a:
:a(int a,
int b)
:m_a
(a),
m_b(b)
//基類b
class b;b:
:b(int b,
int c)
:m_b
(b),
m_c(c)
//派生類c
class c: public a, public b;c:
:c(int a,
int b,
int c,
int d):a
(a, b),b
(b, c)
,m_a
(a),
m_c(c)
,m_d
(d)void c:
:display()
intmain()
a、b 是基類,c 是派生類,假設 obj_c 的起始位址是 0x1000,那麼 obj_c 的記憶體分布如下圖所示:a:
:m_a=
10,a:
:m_b=
20b:
:m_b=
20,b:
:m_c=
30c:
:m_a=
10,c:
:m_c=
30,c:
:m_d=
40
基類物件的排列順序和繼承時宣告的順序相同。
C 繼承5 多重繼承 多繼承
多重繼承 1.person類,資料成員 m strname 成員函式 構造 析構 pay 2.soldier類,資料成員 m iage 成員函式 構造 析構 work 3.infantry類,資料成員 無 成員函式 構造 析構 attack 4.定義函式test1 person p test2 pe...
多繼承與多重繼承
什莫是多繼承?乙個類擁有兩個或者兩個以上的父類 什莫是多重繼承?乙個類不僅僅有父類還有祖父類 什莫是虛繼承?虛繼承是為了解決多繼承的問題 經過這樣的宣告後,當基類通過多條派生路徑被乙個派生類繼承時,該派生類只繼承該基類一次,也就是說,基類成員只保留一次。菱形繼承 以往,在派生類的建構函式中只需負責對...
python多重繼承 多繼承相關
1 使用父類名.方法名呼叫父類方法 class parent def init self,name self.name name print parent的init方法被呼叫 class son1 parent def init self,name,age self.age age parent.i...