多型相關的面試題

2021-07-10 03:38:40 字數 1766 閱讀 4936

1.如何理解多型。

多型的實現效果:同樣的呼叫語句有多種的表現形態;

多型實現的三個條件:有繼承、有virtual重寫、有父類指標(引用)指向子類物件;

多型的c++實現:virtual關鍵字,告訴編譯器這個函式要支援多型;不是根據指標型別判斷如何呼叫;

而是根據指標所指向的實際物件型別來判斷如何呼叫

多型的理論基礎:動態聯編pk靜態聯編,根據實際的物件型別來判斷重寫函式的呼叫。

多型的重要意義:設計模式的基礎是框架的基石;

實現多型的理論基礎:虛函式表的指標做函式引數;

c函式指標是c++至高無上的榮耀。

多型原理**: 與面試官展開討論(見本博的多型原理** vptr指標)

2.談談c++編譯器如何實現多型

c++編譯器多型實現原理,vptr指標,虛函式表

3.談談你對重寫、過載的理解

答:重寫是針對兩個類的,存在繼承關係的,並且函式原型完全相同,使用virtual宣告之後能夠產生多型,如果不使用vir,那叫重定義,那麼子類的函式會對父類同名函式進行重寫。

過載是針對同乙個類 ,有同名函式,但是形參型別或形參個數或者形參順序不一樣。

子類無法過載父類的函式,父類同名函式將被名稱覆蓋。

4.是否可將類中的每個成員函式都宣告為虛函式,為什麼

答:是可以的,但不建議,因為虛函式表是乙個定址的過程,會很浪費時間,並且也浪費記憶體,vptr指標本身需要占用空間。

5.建構函式中能呼叫虛函式,實現多型嗎?

1)物件中的vptr指標什麼時候被初始化?

物件在建立時,由編譯器對vptr指標進行初始化

只有當物件的構造完全結束後vptr的指向才最終確定

父類物件的vptr指向父類虛函式表

子類物件的vptr指向子類虛函式表

答案是不能的,因為只有當物件的構造完全結束後vptr的指向才最終確定,所以當在父類建構函式裡呼叫virtual宣告的print()函式,並沒有呼叫子類的,因為此時vptr指標指向的是父類的虛函式表。這是vptr指標的初始化問題,它是分步初始化的。 

~~~當執行父類的建構函式時候,c1.vptr指向父類的虛函式表,當父類的建構函式執行完畢後,會把c1.vptr指向子類的虛函式表。

6.虛函式表指標(vptr)被編譯器初始化的過程,你是如何理解的?

c++編譯器多型實現原理

7.父類的建構函式中呼叫虛函式,能發生多型嗎?

c++編譯器多型實現原理

8.為什麼要定義虛析構函式。

在什麼情況下應當宣告虛函式

建構函式不能是虛函式,建立乙個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫基類的建構函式。只有當物件的構造完全結束後vptr的指向才最終確定,這個時候,物件都沒有構造結束,也就表示vptr指標還沒有確定,也就是沒有指向的記憶體空間,那麼它怎麼找對應的虛函式表呢???

析構函式可以是虛的,虛析構函式用於指標delete 運算子正確析構動態物件。

9. 父類指標和子類指標的步長

1)鐵律1:指標也只一種資料型別,c++類物件的指標 p++/p--,仍然可用。

2)指標運算是按照指標所指的型別進行的。

p++    ==    p=p+1 //  p=(unsigned int)basep+sizeof(*p)  步長

3)結論:父類p++與子類p++步長不同;不要混搭,不要在陣列上使用多型。

多型相關面試題

多型 同樣的呼叫語句有多種不同的表現形態 同樣乙個函式在不同的子類 父類中穿梭的時候表現出不同的形態。有繼承 有virtual重寫 有父類指標指向子類物件。是通過虛函式重寫實現。virtual關鍵字,告訴編譯器這個函式要支援多型 不是根據指標型別判斷如何呼叫 而是要根據指標所指向的實際物件型別來判斷...

C 多型繼承相關面試題

一 相關概念 類的編譯順序 類名 成員名 成員方法體 類的構造順序 成員物件 類物件 子類的構造 父類 子類 子類的析構 子類 父類 過載 函式名相同 引數列表不同 作用域相同 隱藏 子類隱藏父類中同名的成員方法 覆蓋 子類覆蓋父類中相同的許成員方法 動多型 繼承中的多型 執行時期決定的多型 靜多型...

多型面試題

題目的 如下 class a public string show a obj class b extends a public string show a obj class c extends b class d extends b a a1 new a a a2 new b b b new b...