程序代码 - 2个类,B继承自A,TypeH()发布类字母:
class Program
{
static void Main(string[] args)
{
A z = new A();
A x = new B();
B y = (B)x;
z.TypeH();
x.TypeH();
y.TypeH();
x = (A)y;
x.TypeH();
}
}
class A
{
public virtual void TypeH()
{
Console.WriteLine("A");
}
}
class B : A
{
public override void TypeH()
{
Console.WriteLine("B");
}
}
输出:A B B B. 为什么最后一个输出是B而不是A?
答案 0 :(得分:2)
这称为多态性。实例很重要(B
)而不是类型引用(A
)。
答案 1 :(得分:2)
调用虚方法时,对象的实际实例类型被视为,而不是用于进行方法调用的编译时类型。
答案 2 :(得分:0)
因为TypeH的方法是虚拟 如果删除了虚拟,则在基础引用类型的派生引用类型和基本方法上获取派生方法。对于virtual,有一个运行时间检查 - 如果基本ref实际指向派生类型,则派生方法被调用。
答案 3 :(得分:0)
简单来说,这是因为覆盖关键字将“替换”基类A上的方法,即使您转换为此基类,它仍然是如此。
但是,如果您将B类更改为:
public new void TypeH()
然后 new 关键字将隐藏 TypeH的基类A实现。在这种情况下,当您转换为基类A时,您将获得TypeH的基类A实现。然后您的示例将打印“A”。