假设我们有这样的代码:
interface I
{
    int P { get; }
}
class A : I
{
    public virtual int P { get { return 0; } }
}
class B : A
{
    public override int P { get { return 1; } }
}
class C : B, I
{
    public int P { get { return 2; } }
}
A c = new C();
I ic = new C();
现在的问题是什么是cP和ic.P?其实我知道它会是1和2,但你能解释一下为什么吗?
Gje*_*ema 18
在这种情况下A c = new C();,它将调用它找到的第一个正确覆盖声明的函数的函数A.由于C.P不覆盖它,但隐藏它,虚拟树遍历(多态解析)不会调用该C.P函数,而是调用继承树中的最低值,即B.P.
在这种情况下I ic = new C();,它会愉快地调用直接接口实现P,因为它不关心多态虚拟调用,所以在这种情况下它调用C.P.
注:这是这里的关键是C具有I直接的传承人(即貌似class C : B, I代替class C : B)这种行为.如果没有,那么ic.P调用将再次引用被覆盖的继承,P就像是c.P,并且还将返回1.
你应该看到一个警告,说明以下内容,这有助于你找到一些事情做得不对的线索:
'
C.P'隐藏继承成员'B.P'.要使当前成员覆盖该实现,请添加override关键字.否则添加new关键字.