当前位置: 首页 > 知识库问答 >
问题:

c# - C#继承中的override问题?

孔波
2024-03-03

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

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

共有1个答案

宁浩博
2024-03-03

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");    }}
 类似资料:
  • 主要内容:1、基类和派生类,2、多重继承继承与 封装和 多态被统称为面向对象编程的三大特性,本节我们主要来介绍一下继承这一特性。 在创建一个新类时,我们可以使用这个新定义的类继承一个已有的类,通过继承可以在创建新类时重用、扩展和修改被继承类中定义的成员。被继承的类称为“基类(父类)”,继承基类的类称为“派生类(子类)”。 需要注意的是,C# 中只支持单继承,也就是说一个派生类只能继承一个基类,但是继承是可以传递的,例如 ClassC 继

  • 面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行时间的效果。 当创建一个类时,您不需要重新编写新的数据成员和成员函数,只需指定新建的类继承了一个已有的类的成员即可。这个已有的类称为基类,新建的类称为派生类。 继承代表了 is a 关系。例如,哺乳动物是动物,狗是哺乳动物,因此,狗是动物,等

  • 问题内容: 假设Java具有以下层次结构类: 这是C#中相同代码的(盲)重复: 当我执行Java代码时,我得到了C#返回的信息。 对我来说,C#的结果更有意义,因为引用B调用了它自己的方法。 Java设计者决定打印而不是打印的逻辑是什么?我的意思是,为什么引用B在C中使用覆盖方法?这种方法的优势是什么? 如何更改Java代码以像C#一样打印出来?我的意思是,我怎么教Java调用它使用的完全引用的方

  • 主要内容:1. 基础和派生类,2. 访问控制和继承面向对象编程中最重要的概念之一是继承。继承允许根据一个类定义另一个类,这样可以更容易地创建和维护一个应用程序。 这也提供了重用代码功能和快速实现时间的机会。 在创建类时,程序员可以指定新类应该继承现有类的成员,而不是编写全新的数据成员和成员函数。 此现有类称为基类,新类称为派生类。 继承的想法实现了这种关系。 例如,哺乳动物是一个种类的动物,狗是一种哺乳动物,因此狗是一个动物等等。 1. 基础和派

  • 本文向大家介绍关于C++中菱形继承和虚继承的问题总结,包括了关于C++中菱形继承和虚继承的问题总结的使用技巧和注意事项,需要的朋友参考一下 前言 菱形继承是多重继承中跑不掉的,Java拿掉了多重继承,辅之以接口。C++中虽然没有明确说明接口这种东西,但是只有纯虚函数的类可以看作Java中的接口。在多重继承中建议使用“接口”,来避免多重继承中可能出现的各种问题。本文将给大家详细介绍关于C++菱形继承

  • 主要内容:多继承下的构造函数,命名冲突在前面的例子中,派生类都只有一个基类,称为 单继承(Single Inheritance)。除此之外, C++也支持 多继承(Multiple Inheritance),即一个派生类可以有两个或多个基类。 多继承容易让代码逻辑复杂、思路混乱,一直备受争议,中小型项目中较少使用,后来的 Java、 C#、 PHP 等干脆取消了多继承。 多继承的语法也很简单,将多个基类用逗号隔开即可。例如已声明了类A