C#理解对象为父/子类型时的覆盖

C#理解对象为父/子类型时的覆盖,c#,C#,当我重写一个虚函数时,我总是假设只有当一个对象是该子类类型(而不是基类型)时才会调用重写方法。此答案中的以下语句表明,即使对象是基类型,也将始终调用重写: 即使在对基类的引用上调用该方法,它也会 使用覆盖它的实现 该方法将被重写,并且无论 对象被强制转换为子类或父类 所以我做了这个设置: public class Test { public virtual void DoSomething() { Console.WriteLine("Base called")

当我重写一个虚函数时,我总是假设只有当一个对象是该子类类型(而不是基类型)时才会调用重写方法。此答案中的以下语句表明,即使对象是基类型,也将始终调用重写:

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

该方法将被重写,并且无论 对象被强制转换为子类或父类

所以我做了这个设置:

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();
    }
}
这将导致调用父(测试)方法,而不是重写。因此,当这些语句表示将调用重写时,即使对象被强制转换为子对象或父对象,它们的确切含义是什么

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

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

这里
t
是类型
Test
的引用,但实际实例是类型
TestChild
。在此处调用任何虚拟成员时,将执行
TestChild
中的覆盖

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

Test t = new Test();

你把“对基类的引用”和“类的实例”混为一谈。当然,您可以在基类的*引用中存储派生*类的实例。另一方面,当您有一个基类实例时,它肯定也会调用基类方法。您自己链接的问题提供了许多代码示例来演示所提出的要点,因此,您可以看到您的程序与这些程序有很大的不同;试验。剂量测定()编译器已知的
test
变量类型为
test
,不是
TestChild
,而是调用
TestChild
DoSomething
Test t = new Test();