为什么会这样.One() 从类 B 调用覆盖器方法,而不是从类 A 调用虚拟方法

本文关键字:方法 调用 虚拟 覆盖 One 从类 为什么 | 更新日期: 2023-09-27 17:58:27

class A
{
    public virtual int one()
    {
        return 100;
    }
    public virtual int two()
    {
        return 200;
    }
    public virtual int three()
    {
        return this.one();
    }
}
class B : A
{ 
    public override int one()
    {
        return 300;
    }
    public override int two()
    {
        return this.one();
    }
    public override int three()
    {
        return base.three();
    }
}
class Program
{
    static void Main(string[] args)
    {
        A b = new B();
        Console.WriteLine(b.three());
    }
}

为什么此代码返回"300"?

为什么会这样.One() 从类 B 调用覆盖器方法,而不是从类 A 调用虚拟方法

因为它是virtual.

virtual方法的全部意义在于始终调用重写的版本。

这就是override的定义。

virtual关键字基本上意味着"子类可以覆盖此方法"。

override关键字基本上意味着"我的基类有一个我正在重新定义的虚拟方法">

我认为您的困惑是因为this.one()是从类A调用的. 但是,this仍然引用类B的一个实例,这就是调用B方法的原因。

@SLaks说了什么。

但具体来说,b.three()调用B.three,调用A.three,调用B.one

我认为当你说返回 base.three((; 在被覆盖的方法中,你应该准确地调用 return this.three((; 其他明智的做法是,您将访问基类,即 A。