不要在建構函式中呼叫可重寫的方法

2022-03-02 15:18:30 字數 929 閱讀 9645

原因

非密封型別的構造函式呼叫其類中定義的虛方法。

規則說明

呼叫虛方法時,直到執行時之前都不會選擇執行該方法的實際型別。構造函式呼叫虛方法時,可能尚未執行呼叫該方法的例項的建構函式。

如何修復衝突

要修復與該規則的衝突,請不要從某型別的建構函式中呼叫該型別的虛方法。

何時禁止顯示警告

不要禁止顯示此規則發出的警告。應重新設計該建構函式,以取消對虛方法的呼叫。

示例下面的示例演示與該規則衝突產生的影響。測試應用程式建立 derivedtype 的例項,使其基類 (badlyconstructedtype) 建構函式開始執行。badlyconstructedtype 的建構函式錯誤地呼叫虛方法 dosomething。如輸出所示,derivedtype.dosomething() 將執行,並且是在derivedtype 的建構函式執行前開始執行。

using system;

namespace usagelibrary

// this will be overridden in the derived type.

public virtual void dosomething()

}public class derivedtype : badlyconstructedtype

public override void dosomething()

", initialized);}}

public class testbadlyconstructedtype

}}

該示例產生下面的輸出。

calling base ctor.

derived dosomething is called - initialized ? no

calling derived ctor.

參考:

千萬不要在構造器中呼叫可覆 寫的方法。

下面這個程式有兩個不可變的值類 value class 值類即其實例表示值的類。第乙個類用整數座標來表示平面上的乙個點,第二個類在此基礎上新增了一點顏色。主程式將建立和列印第二個類的乙個例項。那麼,下面的程式將列印出什麼呢?class point protected string makename ...

不要在建構函式和析構函式中呼叫虛函式

提到建構函式和析構函式,想必大家肯定是非常了解,但是能否在建構函式或是析構函式中呼叫虛函式呢?答案是千萬不要這麼做,這麼做不會得到大家想要的結果。首先提一下建構函式,建構函式的順序是從基類開始構造 子類,如果在基類中呼叫虛函式,由於建構函式基類中僅存在自身 或其父類,如果存在 不會根據虛函式表的規則...

C 不要在建構函式和析構函式中呼叫虛函式

這裡先執行個示例 include using namespace std class base virtual void fun virtual void fun 0 base class derived public base virtual void fun virtual void fun d...