如果基類含多個建構函式,多數情況下,派生類一般會整合所有建構函式,以下幾種情況比較特殊
自己管自己的父類
乙個類只繼承直接基類的(父類)的建構函式
。預設,拷貝,移動建構函式不能被整合
class
classa
classa
(int i,
int j,
int k =0)
classa()
};class
classb
:public classa
using classa::classa;
};
這樣看來,using就是讓某個函式名字可見
遇到這條**是,編譯器會把基類中每個建構函式
,都生成乙個與之對應的建構函式
但是到底長什麼樣呢?
classb(引數列表):classa(照抄父類引數列表){}
,比如這個
classb(int i,int j,int k):classa(i,j,k){}
如果有預設引數的話
,那麼編譯器遇到using classa::classa的時候
就會幫我們在派生類中構造出多個建構函式出來
class
grandfather
void
myinfo()
virtual
~grandfather()
};class
father
:public grandfather
virtual
~father()
void
myinfo()
};class
others
virtual
~others()
void
myinfo()
};//派生列表
class
classson
:public father,
public others
virtual
~classson()
//因為父類函式衝突了,子類重寫覆蓋
void
soninfo()
//遇到衝突的問題,可以直接在子類中,進行
//父類::函式/引數
void
soncallparentinfo()
};
int
main()
執行結果:
屬於類,不屬於物件
但是物件也是可以呼叫的
在grandfather中加上
class
grandfather
//為了能夠使用,要定義這個靜態類
//沒有用到就不用定義,使用必須定義,光宣告是不行的
//新建了乙個類others2,只有無參構造方法
class
others2
virtual
~others2()
};class
classson
:public father,
public others,
public others2
}
classa;
};classb;
};classc:
public a,
public b
};
基類指標了一指向派生類物件,編譯器會幫助我們進行轉換,因為每個派生類物件
都包含
乙個基類物件
區域,所以基類的指標和引用可以繫結到基類上
grandfather* g =
newclassson(1
,2,3
);
派生列表中同一類只能出現一次,但是以下情況特別
初始化多次,名字衝突,不能直接呼叫那個類的方法,因為不知道用哪乙個的
如下:我們重寫others類,讓它也和father一樣繼承grandfather類
class
others
:public grandfather
virtual
~others()
void
myinfo()
};intmain()
然後classson類實際上通過father,others類繼承了兩次grandfather類,看一看初始化classson類的效果
真的構造了兩次,不行不行
解決方法:虛繼承
首先,虛基類:無論這個類在繼承體系**現多少次,派生類中都只會包含唯一乙個虛基類子內容
這種虛繼承不對直接子類有意義,只對直接子類派生出來的類才有意義
最後所有虛基類的子類都要虛繼承,才能保證孫類是虛繼承
格式:class classa:virtual father,並且要用孫類的建構函式進行初始化
class
classson
:public father,
public others
}// 宣告虛繼承
class
others
:virtual
public grandfather
// 宣告虛繼承
class
father
:virtual
public grandfather
intmain()
說明兩點: 多重繼承 虛繼承與虛基類
一 多重繼承 單重繼承 乙個派生類最多只能有乙個基類 多重繼承 乙個派生類可以有多個基類 class 類名 繼承方式 基類1,繼承方式 基類2,派生類同時繼承多個基類的成員,更好的軟體重用 可能會有大量的二義性,多個基類中可能包含同名變數或函式 多重繼承中解決訪問歧義的方法 基類名 資料成員名 或成...
C 多重繼承 虛基類
使用多個基類的繼承被稱為多重繼承 mi mi描述的是有多個直接基類的類。與單繼承一樣,公有mi表示的也是 is a關係。mi帶來的兩個主要問題 1.從兩個不同的基類繼承同名方法。2.從兩個或更多相關基類那裡繼承同一類的多個例項。例如 singer 和 waiter都繼承了乙個worker 元件,因此...
C 13 多重繼承 菱形繼承 ,虛繼承,虛基類
就是乙個派生類多個基類,幾乎與單繼承是一致的。唯一考點 菱形繼承結構 b類c類繼承a類,d類繼承a類。產生問題,派生類有多份基類的資料。解決辦法 b c都採用虛繼承,只有乙個虛繼承也無法解決該問題。虛繼承 厲害了,virtual不僅可以宣告虛函式,還可以設定繼承方式 虛繼承 被採用虛繼承的基類 a,...