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();