C#继承中的override问题?

新手上路,请多包涵

C#中的override本身是否具备【重写】的定义,还是说【重写】的定义只有关键字abstract和virtual才有

多层继承后,我不知道子类override的是父类中的override方法还是基类中的abstract方法

阅读 1.1k
1 个回答

abstract 和 virtual 分别用来修饰(或者说声明)抽象函数和虚函数。在 C++ 中,抽象函数被称为“纯虚函数”,所以从更大的概念上来说,我们可以把抽象函数和虚函数都统称为虚函数。虚函数在继承链上定义的时候,会形成虚函数链,并在执行的时候根据执行对象的实际类型来选择虚函数链上正确的那个定义来执行。

override 这个关键字其实就算不要,虚函数链也是可以正确生成的。但是对于写代码的人来说,就会搞不清楚这个函数,到底是不是虚的(因为不清楚父类是否有同签名的虚函数),所以为了方便阅读,定义了 override 关键字来声明该函数是对虚函数的实现,同时也由编译器来检查 override 修饰符是否正确使用。

snipaste_2024-03-03_10-40-24.png

至于override 的是哪一层,并不重要,重要的是它表示的是当前层是虚函数链的一个节点。C# 中与之对应的还有一个 new 修饰符,用来表示该函数不是虚函数链的一个节点(非虚函数实现)

snipaste_2024-03-03_10-45-57.png

代码
using System;
                    
public class Program
{
    public static void Main()
    {
        A b = new B();
        b.Test();
        A c = new C();
        c.Test();
    }
}

class A {
    public virtual void Test() {
        Console.WriteLine("A::Test");
    }
}

class B: A {
    public override void Test() {
        Console.WriteLine("B::Test");
    }
}

class C: B {
    public new void Test() {
        Console.WriteLine("C::Test");
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进