当我覆盖虚函数时,我总是假设只有当一个对象具有该子类类型(而不是基类型)时才会调用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)方法,而不是覆盖。因此,当这些语句表示将调用覆盖时,即使对象被转换为子对象或父对象,它们究竟是什么意思?
如果对象是实例化作为父类型,是否不包括这些语句? (而不是演员)
答案 0 :(得分:1)
将“对基类的引用”与“类的实例”混合在一起。您当然可以在 base -class的引用中存储派生类的实例。
Test t = new TestChild();
此处t
是Test
类型的引用,但实际的实例属于TestChild
类型。在此处呼叫任何虚拟成员时,TestChild
内的覆盖将被执行。
另一方面,当你有一个基类实例时,它肯定会调用基本方法:
Test t = new Test();