我相信您可能会对 C# 版本的工作方式感到困惑:
class A {
public void NonVirt() { Console.Out.WriteLine("A:NonVirt"); }
public virtual void Virt() { Console.Out.WriteLine("A:Virt"); }
}
class B : A {
public void NonVirt() { Console.Out.WriteLine("B:NonVirt"); }
public override void Virt() { Console.Out.WriteLine("B:Virt"); }
}
class Program {
static void Main(string[] args) {
A x = new B();
x.NonVirt();
x.Virt();
}
}
这将输出
A:NonVirt
B:Virt
因此,即使在 C# 中,如果要调用派生实现,也需要将方法设为虚拟。
如果必须在所有非抽象子类中实现方法,这意味着您需要通过基类指针调用它们。这反过来意味着您需要使它们成为虚拟的,就像在 C# 中一样(可能在 Java 中,但我不确定)
顺便说一句,在现代 CPU 上,虚拟调用的价格是几纳秒,所以我不确定它是否值得,但可以说是。
如果你想避免虚拟调用的成本,你应该通过模板使用编译时多态性