2013-04-15 40 views
-1

我遇到了一個正在編寫的程序問題,其中我的虛擬函數似乎沒有按照他們應該的方式行事。函數覆蓋不會調用

我有一個虛擬函數的類和一個覆蓋它的派生類。當我調用函數時,覆蓋不被調用,但基礎是。這是我以前做過一百萬次的事情,我不知道這種行爲會如何破壞,如簡單情況。

舉個例子:

public class ClassA 
{ 
    public DoStuff() 
    { 
    MyVirtual() 
    } 

    protected virtual MyVirtual() 
    { 
    Console.WriteLine("Base MyVirtual Called"); 
    } 
} 

public class ClassB : ClassA 
{ 
    protected override MyVirtual() 
    { 
    Console.WriteLine("Overridden MyVirtual Called"); 
    } 
} 

ClassA test = new ClassB; 
test.DoStuff(); 

這個例子僅僅是作用(我還沒有編譯它來檢查它,我只是證明)。我只想知道什麼可以打破,所以覆蓋不被稱爲。我無法粘貼我的特定代碼,但理論上這很簡單。

  • 的繼承層次就是兩個階級
  • 有沒有sealed修飾符
  • 類是通過一個簡單的調用創建新的繼承類
  • 虛擬功能的保護,從一個叫在基類中的公共函數就像那樣

這怎麼可能破壞或者什麼可能干擾這種行爲?該項目非常複雜,但這並不是我正在實施的新功能。在我的特定代碼中,甚至有另一個虛擬函數以完全相同的方式編寫,並以相同的方式繼承,工作正常。我甚至通過複製/粘貼和重命名來創建新的函數,所以語法應該是相同的(我沒有在沒有工作的時候從頭重建它們,但是它們的行爲沒有區別)。

無論如何,我在我的智慧結尾,我不能花幾天的時間尋找一個隱晦的理由,所以任何想法從哪裏開始尋找將非常感激。

+2

沒有辦法打破它 - 你在示例中顯示的方式。我敢打賭,你的例子並不代表你真正的問題。很可能你的方法不是虛擬的,或者派生版本缺少「覆蓋」或類似的東西。由於該示例與真實代碼無關,因此您有效地要求我們猜測爲什麼我們從未見過的某些代碼不起作用 –

+0

在您可以分享一些代碼之前,請減少非工作代碼。一切正在編譯基礎類是否在一個單獨的項目中?第二個項目中有另一個類,第三個中有派生類嗎?任何功能修改器的更改都需要全部重新編譯。我並不是說這是你的問題,但是如果沒有更多的信息,而且更重要的是那些不起作用的代碼,我們無法猜測的數量會很大。附:我保證,如果你試圖減少你的代碼來製作可共享的樣本,那麼你會發現你的問題。所以去做吧! –

+1

寫得不好的例子。 DoStuff()既不是構造函數,也不是返回類型。 – Areks

回答

4

請注意,如果您修復了編譯成功的錯誤並按照您的預期運行,那麼您的示例編寫得非常糟糕。

修正版本:

public class ClassA 
{ 
    public void DoStuff() 
    { 
    MyVirtual(); 
    } 

    protected virtual void MyVirtual() 
    { 
    Console.WriteLine("Base MyVirtual Called"); 
    } 
} 

public class ClassB : ClassA 
{ 
    protected override void MyVirtual() 
    { 
    Console.WriteLine("Overridden MyVirtual Called"); 
    } 
} 

ClassA test = new ClassB(); 
test.DoStuff(); 

輸出:

Overridden MyVirtual Called 

這基本上意味着,違背了你的語句,你的代碼是不是 「理論上那樣簡單」,我的猜測是你實際上並不是在B班重寫

+1

好的。如上所述,這個例子只是爲了展示這個問題,我沒有編譯它(所以如果我有這些錯誤,我會接受這些錯誤,而且它們不在我正在開發的項目中)。 我跟蹤了這​​個問題,這是我自己的愚蠢和缺乏睡眠。它與虛函數無關,但在我的項目中,有一個針對布爾值的檢查,以確定是否調用該函數,並且複製粘貼是靜態布爾而沒有我的注意。 多一點挖掘,我會意識到這一點,並沒有發佈一個愚蠢的問題。對不起所有。 – SurvivalistDev