C#中的override本身是否具备【重写】的定义,还是说【重写】的定义只有关键字abstract和virtual才有
多层继承后,我不知道子类override的是父类中的override方法还是基类中的abstract方法
C#中的override本身是否具备【重写】的定义,还是说【重写】的定义只有关键字abstract和virtual才有
多层继承后,我不知道子类override的是父类中的override方法还是基类中的abstract方法
一定是其继承的父类的。
你的代码中,如果把 A 的 Output 方法前添加 sealed 关键字(封闭)。那么 B 继承自 A,但 B 的 override 列表里就没有 Output 方法,也就是无法重写 Output 方法了。但此时 B 类依然存在 Output 方法,实际是 A 的。
``C#
B b = new ( );
b . Output ( ); // A 的 Output 的副本
``
abstract 和 virtual 分别用来修饰(或者说声明)抽象函数和虚函数。在 C++ 中,抽象函数被称为“纯虚函数”,所以从更大的概念上来说,我们可以把抽象函数和虚函数都统称为虚函数。虚函数在继承链上定义的时候,会形成虚函数链,并在执行的时候根据执行对象的实际类型来选择虚函数链上正确的那个定义来执行。
override 这个关键字其实就算不要,虚函数链也是可以正确生成的。但是对于写代码的人来说,就会搞不清楚这个函数,到底是不是虚的(因为不清楚父类是否有同签名的虚函数),所以为了方便阅读,定义了 override 关键字来声明该函数是对虚函数的实现,同时也由编译器来检查 override 修饰符是否正确使用。
至于override 的是哪一层,并不重要,重要的是它表示的是当前层是虚函数链的一个节点。C# 中与之对应的还有一个 new 修饰符,用来表示该函数不是虚函数链的一个节点(非虚函数实现)