c# - 从 derived 而不是 base 调用的虚拟方法

标签 c# virtual base derived-class

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

    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

它是运行时还是编译时的 future ?

我知道我可以通过调用 base.VirtualMethod() 从派生调用 Base 的虚方法,但我可以从外部调用它吗? (比如来自 Main 或其他一些类)

最佳答案

方法实现是根据对象的执行时间类型来选择的。这是它的很大一部分要点。任何人都可以使用:

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

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

I know i can call the Base's virtual method from the derived by calling base.VirtualMethod() but can I call it from outside?

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

关于c# - 从 derived 而不是 base 调用的虚拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15140911/

相关文章:

c# - 在 Visual Studio 中将应用程序移动到另一台计算机时复制数据库文件

c++ - 在这种情况下,如何管理继承?

具有抽象基类的 C++ 虚拟继承

android - 如何在Android模拟器上安装openCV

java - 在不损失精度的情况下转换 float 的基数

perl - pragma base - 警告问题

c# - 如何阻止按钮控件中的文本在 Winforms 中将单词分成多行?

c# - 使用 asp.net 获取 Web 浏览器控件源

c# - Canon EDSDK 命令 TakePicture 在焦点错误后阻止所有内容

c# - 确保在 C# 中调用基方法