首页 >后端开发 >C++ >方法继承中的'新”和'覆盖”关键字有什么区别?

方法继承中的'新”和'覆盖”关键字有什么区别?

DDD
DDD原创
2025-01-28 11:56:09260浏览

What's the Difference Between `new` and `override` Keywords in Method Inheritance?

深入理解“new”和“override”关键字

面向对象编程中,继承是核心概念,允许派生类扩展和修改基类的行为。在定义这些类的方法时,开发者可能需要重写或创建新的实现。为了阐明这种区别,让我们考察以下场景:

场景一:基类

<code class="language-c#">public virtual void DoIt();</code>

此语法在基类中声明了一个虚方法。虚方法可以在派生类中被重写以提供具体的实现。

场景一:派生类

<code class="language-c#">public new void DoIt();</code>

在派生类方法中使用“new”会创建一个新的、独立的方法,其名称与基类中的方法相同。但是,这不被认为是重写,并且当从基类引用调用时,不会影响基类方法的行为。

场景二:基类

<code class="language-c#">public void DoIt();</code>

这是一个非虚方法,不能在派生类中被重写。派生类必须使用“new”修饰符实现一个具有相同名称的新方法。

场景二:派生类

<code class="language-c#">public override void DoIt();</code>

“override”修饰符表示派生类中的方法正在重写基类中具有相同签名的另一个方法。当通过基类引用调用时,将执行重写的方法。

实际区别

  • Override: 无论引用类型如何,只要调用该方法,派生类中的重写方法就会被调用。
  • New: 只有当引用派生类对象时,派生类中新创建的方法才会被调用。

推荐用法

通常,当扩展继承方法的行为时,建议使用“override”。如果要在派生类中创建具有相同名称的新方法,请使用“new”。

示例

考虑以下代码:

<code class="language-c#">public class Base
{
    public virtual void DoIt()
    {
        Console.WriteLine("Base.DoIt");
    }
}

public class Derived : Base
{
    public override void DoIt()
    {
        Console.WriteLine("Derived.DoIt");
    }
}

Base b = new Derived();
b.DoIt();                      // 调用 Derived.DoIt</code>

在此示例中,“Derived.DoIt()”重写了“Base.DoIt()”,并且当从引用“Derived”对象的“b”变量调用“DoIt()”方法时,会调用它。

以上是方法继承中的'新”和'覆盖”关键字有什么区别?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn