从derived而不是base调用的虚方法

有人可以向我解释为什么在将类转换为基类时调用重写的方法:

class Base { public virtual void VirtualMethod() { Console.WriteLine("Base virtual method"); } } sealed class Derived : Base { public override void VirtualMethod() { Console.WriteLine("Overriden method"); } } static void Main(String[] args) { Derived d = new Derived(); ((Base)d).VirtualMethod(); } 

我的意思是这个代码打印:

 Overriden method 

并不是

 Base virtual method 

它是一个运行时或编译时的未来?

我知道我可以通过调用base.VirtualMethod()来调用Base的虚方法,但是我可以从外面调用吗? (如来自Main或其他课程)

基于对象的执行时类型选择方法实现。 这是它的重要组成部分。 任何人都可以用:

 public void Foo(Base b) { b.VirtualMethod(); } 

……并且不需要知道或关心执行类型是什么,因为多态性会处理它。

我知道我可以通过调用base.VirtualMethod()来调用Base的虚方法,但是我可以从外面调用吗?

不(至少,不是没有一些可怕的hackery非虚拟地调用虚方法),这是封装的故意部分。 覆盖实现已有效地替换了该对象的原始实现。

如果要访问基本实现,则不应使用override,应使用new。 覆盖覆盖任何父实现,新“隐藏”父实现,以便您可以通过强制转换为父对象然后调用该方法来访问实现。

 internal class Program { private static void Main(string[] args) { Derived d = new Derived(); d.VirtualMethod(); ((Base) d).VirtualMethod(); Console.ReadLine(); } private class Base { public virtual void VirtualMethod() { Console.WriteLine("Base virtual method"); } } private sealed class Derived : Base { public new void VirtualMethod() { Console.WriteLine("Overriden method"); } } } 

这将输出:

Overriden方法
基本虚方法