C 與C 關於虛函式呼叫的一點比較

2021-04-07 07:01:55 字數 696 閱讀 8284

在c++faq上看到乙個關於虛函式的過載說明,原貼內容如下:

當基類被構造時,物件還不是乙個派生類的物件,所以如果 base::base()呼叫了虛函式

virt(),則 base::virt() 將被呼叫,即使 derived::virt()(譯註:即派生類重寫的虛函式)存在。

同樣,當基類被析構時,物件已經不再是乙個派生類物件了,所以如果 base::~base()呼叫了virt(),則 base::virt()得到控制權,而不是重寫的 derived::virt() 。

當你可以想象到如果 derived::virt() 涉及到派生類的某個成員物件將造成的災難的時候,你很快就能看到這種方法的明智。詳細來說,如果 base::base()呼叫了虛函式 virt(),這個規則使得 base::virt()被呼叫。如果不按照這個規則,derived::virt()將在派生物件的派生部分被構造之前被呼叫,此時屬於派生物件的派生部分的某個成員物件還沒有被構造,而 derived::virt()卻能夠訪問它。這將是災難。

意思是說在c++中,如果基類的建構函式中呼叫它定義的的虛函式,即使在派生類中對這個虛函式進行了重寫,實際執行中呼叫的仍是基類的版本。具體原因可以參見上面的說明,大概意思是在基類的建構函式中,子類物件還未被構造出來,所以這個時候呼叫的仍是基類的。

但是在c#中,同樣的情況,基類中呼叫的卻是派生類重寫後的版本。我在本機是試過,執行結果是這樣的,但是不是太明白為什麼。

關於 C 刪除函式的一點問題

之前的專案在c 中有用到了 刪除函式 1 namespace framework2 22 如上面的 當某個函式被賦值為 delete 時,代表著這個函式被宣告為了 刪除函式,即不可以被呼叫。而此刻的無參建構函式被宣告成為了刪除函式,代表著系統也不會為這個類自動生成建構函式,如此當外部使用的時候就強制...

關於C語言的隨機函式的一點思考

今天在看書的過程遇到乙個問題,大致描述如下 編寫乙個函式,通過返回範圍1至6的隨機整數來模擬擲篩子。同時,這個題目要求這個6個數字出現的概率是相等的。首先,對於這個問題的基本思路如下 首先,用srand函式對隨機數發生器進行初始化。其次,迴圈呼叫rand函式六次,對每一次呼叫的結果與6取模,然後再加...

C 繼承與建構函式一點說明

include using namespace std int i 1 class mycls void echo private int m nfir int m nsec int m nthd int m nfor int main 結果為 11析 如果為繼承的話,此為classmycls bc...