虛函式在筆試中的題型

2021-07-08 21:28:56 字數 1853 閱讀 1888

下面總結了一些虛函式在筆試中的題型

建構函式可以呼叫虛函式嗎?語法上通過嗎?語義上可以通過嗎?

可以,語法可以通過,但是不能實現多型,其語義是無法通過的。根據c++類初始化方式的定義,派生類在初始化時會呼叫父類的建構函式,但是若在呼叫父類的建構函式中出現了虛函式,是不會呈現多型的,因為此時派生類還沒有完成初始化,所以是不能呈現多型的。如果在基類的構造中呼叫虛函式,如果可以的話就是呼叫乙個還沒有被初始化的物件,那是很危險的,所以c++中是不可以在構造父類物件部分的時候呼叫子類的虛函式實現。但是不是說你不可以那麼寫程式,你這麼寫,編譯器也不會報錯。

建構函式可以呼叫虛函式嗎?語法上通過嗎?語義上可以通過嗎?

可以。語法上可以通過。但是非常危險,不推薦使用。在析構函式中也不要呼叫虛函式。在析構的時候會首先呼叫子類的析構函式,析構掉物件中的子類部分,然後在呼叫基類的析構函式析構基類部分,如果在基類的析構函式裡面呼叫虛函式,會導致其呼叫已經析構了的子類物件裡面的函式,這是非常危險的

構造、析構函式可以是虛函式嗎?

建構函式不可以是虛函式,因為構造時,物件還是一片未定型的**地(感覺錢能老師文筆好叼),只有在完成構造完成後,物件才能成為乙個名副其實的物件。

析構函式可以是虛函式,並且通常申明為虛函式。在類的繼承中,如果有基類的指標指向派生類的物件,若基類的建構函式不是虛函式,則派生類的那部分無法完成析構,所以最好將基類的析構函式申明為虛函式,在刪除基類指標的時候,首先會呼叫子類的析構函式。

同時還包括以下幾個問題:

靜態成員函式可以是虛函式嗎?

靜態成員函式不可以是虛函式,因為靜態成員函式不接受物件的**呼叫。不能**呼叫也就失去了多型的必要條件,因為多型就是在執行時根據實際的物件,呼叫其相應得虛函式(滯後繫結),所以靜態成員函式不可以是虛函式。

內聯函式可以是虛函式嗎?

內聯函式不可以是虛函式,因為虛函式是滯後繫結,而內聯函式是不能在執行中動態的確定其位置。即使虛函式在類的內部定義,編譯器編譯時仍然將她視為非內聯。

最後強調一句,只有類的成員函式才能申明為虛函式。例1

#includeusing namespace std;

class b

};class d :public b

};void fun(b *b)

int main()

執行結果:

分析,在

****

之前是繼承關係中的構造函式呼叫,在

****

之後是繼承關係中的析構函式呼叫,從中可以得出,析構、建構函式都可以呼叫虛函式,但是析構函式中的虛函式是不能體現多型的,比如結果第一條輸出(

base:fun

)就是在基類中的。

關於虛函式的滯後繫結其餘的不用多解釋,下面介紹乙個特例。

關於虛函式的滯後繫結,必須要求父類、子類的虛函式,返回型別、名稱、行參一模一樣。但是有個例外,那就是允許子類、父類的虛函式的返回值是各自的物件指標。

如下所示:

#includeusing namespace std;

class b

};class d :public b

};void fun(b *b)

int main()

這個例外是可以理解的。因為父類、子類的虛函式返回各自的物件指標,更自然,更符合函式呼叫的一些習慣,但是只能這樣書寫才符合規範。在一般函式定義中,若函式至今僅僅是函式的返回值不同,則編譯器會分不清呼叫哪個函式而報錯,比如以下兩個函式在乙個原始檔中會報錯。

void f(int)

int f(int)

c 虛析構函式在虛函式表中嗎?

先放結論 在的!而且與宣告的先後順序有關 為什麼有這個疑問呢?因為析構函式的名字不一樣啊.好吧,是我too young了 實驗 的繼承關係如下 class fa virtual fa virtual show virtual wohs class son public fa virtual son ...

虛函式中「虛」的理解

1 首先回顧一下虛函式的概念 虛函式 不代表一定需要子類去實現,而是可以通過基類的指標呼叫子類的此函式。純虛函式 一定需要子類去實現它,它定義的僅僅是一組行為,擁有純虛函式的類即為抽象類,只能當做基類,無法例項化。2 為什麼叫 虛 函式呢 正是這個函式呼叫的不可 性,而這種不可 性即函式的呼叫在編譯...

C 中的虛函式 純虛函式

c 最重要的特性就是多型,而多型,就主要通過虛函式實現的。具體的實現過程是 基類中的函式定義為虛函式,派生類發生覆蓋 即函式名稱 引數列表 返回值型別完全相同 的情況下,派生類中的函式也會自動變成虛函式,不論加不加virtual關鍵字。此時,基類與子類物件中都會存在一張虛函式表 因為含有虛函式 具體...