函数覆盖不调用

问题描述 投票:0回答: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();

此示例仅是为了效果(我尚未对其进行编译以进行检查,我只是在进行演示)。我只想知道什么可以打破它,所以不调用覆盖。我无法粘贴我的特定代码,但从理论上讲就是那样简单。

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

这怎么可能中断或什么会干扰该行为?该项目非常复杂,但这并不是我正在实施的新内容。在我的特定代码中,甚至还有另一个完全相同的虚拟函数,并且以相同的方式继承,这很好用。我什至通过复制/粘贴该函数并重命名来制作新函数,因此语法应该相同(当它们不起作用时,我从头开始重建它们,但对其行为没有任何影响)。

无论如何,我精疲力尽,我不能花几天时间寻找一个晦涩的原因,因此,从何处着手的任何想法都将受到极大的赞赏。

c# virtual
1个回答
6
投票

如果您修复了错误,则它会成功编译并按预期运行。

固定版本:

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类中您实际上并未覆盖]。

© www.soinside.com 2019 - 2024. All rights reserved.