函数覆盖不调用

时间:2013-04-15 11:48:40

标签: 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();

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

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

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

无论如何,我在我的智慧结束,我不能花几天时间寻找一个不明原因,所以任何关于从哪里开始寻找的想法都会非常感激。

2 个答案:

答案 0 :(得分: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();

<强>输出:

Overridden MyVirtual Called

这基本上意味着,与你的陈述相反,你的代码并非“理论上那么简单”,我的猜测是你实际上并没有在B类中重写

答案 1 :(得分:0)

如果继承链中有多个类,您可能需要检查这些类中所有同名的方法(如果存在)是否具有“覆盖”