原因
非密封型別的構造函式呼叫其類中定義的虛方法。
規則說明
呼叫虛方法時,直到執行時之前都不會選擇執行該方法的實際型別。構造函式呼叫虛方法時,可能尚未執行呼叫該方法的例項的建構函式。
如何修復衝突
要修復與該規則的衝突,請不要從某型別的建構函式中呼叫該型別的虛方法。
何時禁止顯示警告
不要禁止顯示此規則發出的警告。應重新設計該建構函式,以取消對虛方法的呼叫。
示例下面的示例演示與該規則衝突產生的影響。測試應用程式建立 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...