C 的探索路16 多型與虛函式之練習篇

2021-08-14 07:45:46 字數 2827 閱讀 9623

class a 

virtual void func()

~a()

virtual void fund()

};class b :public a

void fun()

~b()

};class c :public b

void func()

~c()

void fund()

};int main()

程式中包含了a,b,c三個類,a派生出b,b派生出c。

a類中包含什麼都不做的建構函式與析構函式,此外其還包含能夠列印相應內容的虛函式func()以及fund()。

b類包含建構函式以及析構函式,其中建構函式中包含func(),析構函式中包含fund()。除了析構與建構函式,還包含fun()函式,fun()函式中呼叫func()函式。

c類包含建構函式與析構函式,建構函式什麼都不做,析構函式包含fund()。除此外,其還包含func()與fund()

主程式中定義了c類的物件c。

在整個程式執行的過程中包含了c類物件c的構造與析構過程。

而由前面基礎內容可得兩個知識點:

1,同參同返回型別的函式一旦定義為虛函式,則派生類的同參同返回函式也為虛函式。

2,析構函式與析構函式不存在多型的現象。即編譯時可以確定哪個呼叫哪個。如果本類有該函式,呼叫本類;如果沒有,呼叫直接基類;如果直接基類沒有,呼叫間接基類.

按照順序,首先是a類構造,什麼都不做

然後b類構造,呼叫本類func(),func()不存在則往上找到a的func(),輸出a::func

接著c類構造,什麼也不做。

然後反向順序析構:

先析構c,呼叫fund(),輸出c::fund

在呼叫b, 呼叫本類fund(),不存在,則往上找,輸出a::fund

最後呼叫a,什麼也不做。

因此輸出順序為

a::func

c::fund

a::fund

執行驗證

這裡可能會有個疑問:

1,把a的fund()刪掉會怎麼樣?

那當然是報錯了->顯示未定義識別符號

2,a類的virtual關鍵字去掉?

顯然並沒有影響,人還是活的好好的,繼續呼叫

destructor b

destructor a

請寫出完整的class a,限制條件:不得為class a編寫建構函式

class a{};

class b : public a

};int main()

這個有點弱雞,直接是書寫虛建構函式。不寫的話就直接是destructor b的輸出了

class a

};

a::fun

a::do

a::fun

c::do

請填空

class a 

virtual void do()

};class b :public a

};class c :public b

void fun()

};void call(_______)

int main()

程式包含a,b,c三個類,a派生出b,b派生出c

這三個類均共有do()函式以及fun()函式,其中do()函式至始至終從上到下都是虛函式,而fun函式則不是虛函式,程式包含細節如下:

a類包含成員變數nval,除此外還包含列印a::fun的普通函式fun()和能夠列印a::do的虛函式do()

b類包含能夠列印b::do的虛函式do(),其實這條語句加不加virtual並沒有什麼關係,因為基類某個函式宣告為虛函式,那麼派生類中,同名,同參數列的成員函式即使不寫virtual關鍵字也自動成為虛函式。

c類包含列印c::do的do()函式以及列印c::fun的fun()函式

三個類外還包含call()函式,形參未知,函式內部呼叫p指標分別指向fun()以及do()兩個函式

主程式中兩次呼叫call函式,輸入形參分別為new a()以及new c()

程式輸出為

a::fun

a::do

a::fun

c::do

程式解答

寫了這麼一大串,作為練習感覺,效果不是很好,因為裡面有技巧:

call函式內部包含指標p,所以形參一定是個指標,什麼型別呢,一般都是a類,如果定義為b或c的話,對於call(new a())就執行不過去了

那就分析下這貨為什麼是這樣

首先是call(new a),這一句沒有多大波瀾,直接指向a,也不存在虛函式會對最終結果產生什麼波動,因此這條輸出

a::fun

a::do

然後是call(new c),這一句稍微有點變化,因為存在虛函式do()以及普通函式fun()

對於虛函式則指向當前的物件:new出來的c,輸出c::do,而對於非虛函式fun(),不存在多型搗亂則列印a::fun

本部分的習題課有點波瀾不驚,沒有太大的難度;需要後續結合其他程式進行綜合練習。

多型與虛函式這部分的重點在於:

1,如果函式執行為多型,則以指向呼叫的位址為準,進行相應的演化。

2,析構與建構函式不為多型,是直接呼叫的,如果本類不存在則向上尋找基類中的同名函式

3,虛析構函式能夠使記憶體釋放完全

探索虛函式與多型

測試環境 win10 64位 vs2013 一些概念 虛函式 類的成員函式前面加上virtual關鍵字,則此成員函式即為虛函式。重寫 在子類定義了乙個與父類完全相同的虛函式,則稱子類的虛函式重寫了父類的虛函式。多型 多型就是多種形態,c 的多型分為靜態多型和動態多型。靜態多型就是過載,因為在編譯期間...

複習 C 之虛函式與多型

c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父類的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有 多種形態 這是一種泛型技術。所謂泛型技術就是試圖使用不變的 來實現可變的演算法。比如 模板技術,rtti技術,虛函式技術,要麼是試圖做...

C 繼承與多型之虛函式

一 定義 虛函式必須是基類的非靜態成員函式,其訪問許可權可以是private或protected或public,在基類的類定義中定義虛函式的一般形式。虛函式是一種在基類定義為virtual的函式,並在乙個或多個派生類中再定義的函式。實現多型性。虛函式的特點是,只要定義乙個基類的指標,就可以指向派生類...