C#了解对象是父/子类型时的覆盖

时间:2017-09-20 13:32:42

标签: c#

当我覆盖虚函数时,我总是假设只有当一个对象具有该子类类型(而不是基类型)时才会调用override方法。本回答中的以下陈述表明,即使对象是基类型,也始终会调用覆盖:

Difference between new and override

  

即使在对基类的引用上调用该方法,它也会   使用覆盖它的实现。

     

重写该方法,无论是否调用,都将调用该方法   object被转换为子类或父类。

所以我做了这个设置:

public class Test
{
    public virtual void DoSomething()
    {
        Console.WriteLine("Base called");
    }
}

public class TestChild : Test
{
    public override void DoSomething()
    {
        Console.WriteLine("Child called");
    }
}

class Program
{
    static void Main(string[] args)
    {
        var test = new Test();
        test.DoSomething();
    }
}

这导致调用父(Test)方法,而不是覆盖。因此,当这些语句表示将调用覆盖时,即使对象被转换为子对象或父对象,它们究竟是什么意思?

如果对象是实例化作为父类型,是否不包括这些语句? (而不是演员)

1 个答案:

答案 0 :(得分:1)

将“对基类的引用”与“类的实例”混合在一起。您当然可以在 base -class的引用中存储派生类的实例。

Test t = new TestChild();

此处tTest类型的引用,但实际的实例属于TestChild类型。在此处呼叫任何虚拟成员时,TestChild内的覆盖将被执行。

另一方面,当你有一个基类实例时,它肯定会调用基本方法:

Test t = new Test();