下面總結了一些虛函式在筆試中的題型
建構函式可以呼叫虛函式嗎?語法上通過嗎?語義上可以通過嗎?
可以,語法可以通過,但是不能實現多型,其語義是無法通過的。根據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關鍵字。此時,基類與子類物件中都會存在一張虛函式表 因為含有虛函式 具體...