C 基礎知識,多重繼承,虛基類,虛繼承

2021-09-29 11:05:02 字數 3417 閱讀 8705

如果基類含多個建構函式,多數情況下,派生類一般會整合所有建構函式,以下幾種情況比較特殊

自己管自己的父類

乙個類只繼承直接基類的(父類)的建構函式。預設,拷貝,移動建構函式不能被整合

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,...