【发布时间】:2013-04-15 11:48:40
【问题描述】:
我正在编写的程序出现问题,我的虚拟函数似乎没有按应有的方式运行。
我有一个带有虚函数的类,以及一个覆盖它的派生类。当我调用该函数时,不会调用覆盖,但会调用基础。这是我之前做过一百万次的事情,但我不知道这种行为在简单的情况下是如何破坏的。
举个例子:
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 来创建的
- 虚函数受到保护,并像这样从基类中的公共函数调用
这怎么可能破坏或者什么会干扰这种行为?该项目非常复杂,但这并不是我正在实施的新事物。在我的特定代码中,甚至还有另一个以完全相同的方式编写并以相同方式继承的虚函数,效果很好。我什至通过复制/粘贴该函数并重命名来创建新函数,因此语法应该相同(当它们不起作用时我确实从头开始重建它们,但它们的行为没有区别)。
无论如何,我已经束手无策了,我不能花几天时间为此寻找一个晦涩难懂的原因,所以任何关于从哪里开始寻找的想法都将不胜感激。
【问题讨论】:
-
没有什么不能破坏它 - 您在示例中显示的方式。我敢打赌,您的示例并不代表您遇到的真正问题。很可能您的方法不是虚拟的,或者派生版本缺少“覆盖”或类似的东西。由于示例与真实代码无关,您实际上是在让我们猜测为什么我们从未见过的某些代码不起作用
-
减少你的非工作代码,直到你有一些可以分享的代码。是否正在编译所有内容,例如基类是否在单独的项目中?第二个项目中有另一个类,第三个项目中有你的派生类吗?任何函数修饰符更改都需要重新编译所有三个。我并不是说这是你的问题,但如果没有更多信息,我们无法猜测,更重要的是代码不起作用,可能会发生大量事情。附:我保证,如果您尝试减少代码以制作可共享的示例,那么您会发现问题。所以去做吧!
-
写得不好的例子。 DoStuff() 既不是构造函数,也没有返回类型。
-
您是否 100% 确定派生类具有该方法的 virtual 关键字,并且该方法没有被隐藏/隐藏,这意味着始终调用基方法?除非我忘记覆盖,否则我从未经历过这样的事情,但编译器应该警告这一点。
-
我敢打赌派生类中没有
override,但示例中另有说明