函数覆盖不调用

Sur*_*Dev 0 c# virtual

我正在编写一个正在编写的程序的问题,我的虚函数似乎没有按照应有的方式运行.

我有一个带有虚函数的类,以及一个覆盖它的派生类.当我调用该函数时,不会调用覆盖,但是底部是.这是我之前已经完成了一百万次的事情,我不知道这种行为如何在简单的案例中突破.

举个例子:

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();
Run Code Online (Sandbox Code Playgroud)

这个例子只是为了效果(我没有编译它来检查它,我只是在演示).我只是想知道什么可以破坏,所以不会调用覆盖.我无法粘贴我的特定代码,但理论上它就像那样简单.

  • 继承层次结构只是两个类
  • 没有密封修饰符
  • 该类是通过对继承类的new调用创建的
  • 虚函数受保护,并从基类中的公共函数调用

怎么可能破坏或可能干扰这种行为?该项目非常复杂,但这并不是我正在实施的新内容.在我的特定代码中,甚至还有另一个虚函数以完全相同的方式编写并以相同的方式继承,工作正常.我甚至通过复制/粘贴那个并重命名来创建新函数,所以语法应该是相同的(我确实在他们不工作时从头开始重建它们,但它们的行为没有区别).

无论如何,我在我的智慧结束,我不能花几天时间寻找一个不起眼的理由,所以任何关于从哪里开始寻找的想法将非常感激.

Are*_*eks 5

请注意,您的示例写得非常糟糕,如果您修复了错误,它会成功编译并按照您的预期运行.

固定版本:

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();
Run Code Online (Sandbox Code Playgroud)

输出:

Overridden MyVirtual Called
Run Code Online (Sandbox Code Playgroud)

这基本上意味着,与你的陈述相反,你的代码并不"理论上那么简单",我的猜测是你实际上并没有覆盖 B类.

  • 好的。如前所述,该示例只是为了显示问题,我还没有编译它(所以如果我有的话,我会发现这些错误,并且它们不存在于我正在处理的项目中)。我已经找到了问题所在,这是我自己的愚蠢和睡眠不足。它与虚函数无关,但在我的项目中,有一个布尔值检查,以确定是否甚至调用该函数,并且复制粘贴是一个静态布尔值,而我没有注意到。多一点挖掘,我会意识到这一点,而不是发布一个愚蠢的问题。对不起大家。 (2认同)
  • “写得非常糟糕”好吧,这太夸张了。您唯一更改的是将“受保护的虚拟”更改为“受保护的虚拟无效”,并且添加了一个缺少的分号。一个理性的人会注意到像“ClassA、ClassB、DoStuff”这样的名称,并意识到OP没有复制/粘贴代码,显然只是有一些拼写错误。 (2认同)
  • @MEE你是对的。我向 SurvivalistDev 和你们所有人道歉。我确实很夸张而且粗鲁。老实说,我不知道我是否在床的错误一侧醒来,但这不是借口。对不起。 (2认同)