函数覆盖不调用

本文关键字:调用 覆盖 函数 | 更新日期: 2023-09-27 18:09:08

我正在编写一个程序,其中我的虚函数似乎没有按照它们应该的方式行事。

我有一个带有虚函数的类,以及一个覆盖它的派生类。当我调用函数时,重写没有被调用,但是基被调用了。这是我以前做过无数次的事情,我不知道这种行为是如何在这样简单的情况下中断的。

例如:

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();

这个例子只是为了效果(我没有编译它来检查它,我只是演示)。我只是想知道什么可以破坏它,这样重写就不会被调用。我不能粘贴我的特定代码,但理论上就是这么简单。

  • 继承层次结构就是两个类
  • 没有密封修饰符
  • 通过对继承类
  • 的new的简单调用来创建类虚函数被基类中的公共函数保护和调用,就像这样

这怎么可能会中断,或者什么会干扰这种行为?这个项目很复杂,但我正在实施的并不是什么新鲜事。在我的特定代码中,甚至还有另一个以完全相同的方式编写并以相同的方式继承的虚函数,它工作得很好。我甚至通过复制/粘贴那个函数并重命名来创建新函数,因此语法应该是相同的(当它们不起作用时,我确实从头开始重新构建它们,但它们的行为没有区别)。

无论如何,我已经绞尽脑汁了,我不能花几天时间去寻找一个模糊的原因,所以任何关于从哪里开始寻找的想法都会非常感谢。

函数覆盖不调用

如果您修复了错误,它将成功编译并表现出您期望的行为。

固定版本:

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类中重写

如果在继承链中有多个类,您可能希望检查这些类(如果存在的话)中具有相同名称的所有方法是否已经"覆盖"了