为什么我的转换/转换失败?

时间:2012-05-02 10:12:54

标签: c# inheritance casting type-conversion

程序代码 - 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?

4 个答案:

答案 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”。