2

程序代码 - 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");
    }
}    

输出:ABBB 为什么最后一个输出是 B 而不是 A?

4

4 回答 4

2

这称为多态性。实例很重要(即B)而不是类型引用(即A)。

于 2012-05-02T10:15:59.837 回答
2

调用虚方法时,会考虑对象的实际实例类型,而不是用于进行方法调用的编译时类型。

于 2012-05-02T10:17:13.897 回答
0

因为方法 TypeH 是virtual
如果您删除了虚拟,那么您将获得派生引用类型的派生方法和基本引用类型的基方法。使用 virtual 有一个运行时检查 - 如果基本 ref 实际上指向派生类型,则调用派生方法。

于 2012-05-02T10:16:43.140 回答
0

简单来说,这是因为override关键字将“替换”基类 A 上的方法,即使您强制转换为该基类,它仍然如此。

但是,如果您将 B 类更改为:

public new void TypeH()

那么new关键字只会隐藏TypeH 的基类 A 实现。在这种情况下,当您向下转换为基类 A 时,您将获得 TypeH 的基类 A 实现。然后,您的示例将打印“A”。

于 2012-05-02T10:52:20.443 回答