21xrx.com
2024-12-27 13:48:54 Friday
登录
文章检索 我的文章 写文章
C++重写和覆盖的区别和实例解析
2023-07-08 11:30:25 深夜i     --     --
C++ 重写 覆盖 区别 实例解析

C++中的编程概念包含了许多重要的知识点,其中有两种概念:重写和覆盖,它们分别被用来描述类别中的不同函数。这两种方法虽然看起来相似,但是它们实际上有区别,下面我们将介绍这两种方法的具体区别和实例解析。

首先,我们先来介绍一下C++中的重写。重写(Overriding)是一个子类继承了一个父类方法,并且根据自己的需要改写该方法的行为。这种方法的目的是在不改变原始函数签名的情况下,实现有所不同的的功能。重写具有相同的方法名称和参数列表,但是子类中的代码会覆盖掉它在父类中的实现。这样,当一个对象调用该函数时,它将会使用子类中的版本。

接下来我们来讲讲覆盖(Overloading)。覆盖是一种不同的处理方法,它允许在同一类中定义多个具有相同名称但不同参数列表的函数。这意味着你可以根据需要创建不同的方法实现,而每个方法都有独特的功能。覆盖是函数重载的一种形式,并且在调用函数时,编译器将根据传递给各个函数的值以及它们期望的返回类型来决定使用哪个版本。

现在我们来看看重写和覆盖之间的差异。当子类重写一个父类的方法时,两个方法必须具有相同的方法名称和参数列表,但是它们的函数体可以有所不同。与此不同,当你使用函数覆盖时,你可以在子类中创建一个新的方法,让它具有与父类的方法相同的名称,但是拥有不同的参数和/或函数体。因此,当对象调用该函数时,编译器将根据所传递的参数列表自动选择使用哪一个版本。

下面我们用实例解析来更好地理解这两种概念之间的区别:


#include <iostream>

#include <string>

using namespace std;

class Animal {

public:

  virtual void makeSound(string sound)

    cout << "The animal makes the sound " << sound << endl;

  

};

class Dog : public Animal {

public:

 

  void makeSound(string sound)

    cout << "The dog barks " << sound << endl;

  

};

int main() {

  Animal *a = new Animal;

  a->makeSound("growl");

  

  Dog *d = new Dog;

  d->makeSound("woof");

  

  Animal *ad = new Dog;

  ad->makeSound("bark");

  

  return 0;

}

现在我们将该代码保存并执行。输出:


The animal makes the sound growl

The dog barks woof

The dog barks bark

在上面的代码中,我们有一个Animal父类和一个Dog子类,后者继承了Animal。在类中,我们定义了一个动物发出声音的方法makeSound。父类中的该方法具有一个默认的输出,而子类中的该方法具有特定的“狗叫声”输出。

现在,您可能会认为由于我们已经在子类中定义了makeSound方法,父类中的该方法将不再被调用。但是,上面的输出显示了,即使在子类具有makeSound实现的情况下,父类中的该方法仍然被调用。

这就是因为在Animal类中,我们将makeSound定义为virtual,这仅是在子类中重写它,如果它未被子类中的任何方法覆盖,那么就会在父类中使用它的实现。

这使得我们可以在makeSound方法中覆盖dog-barks字符串,但是如果我们仅在子类中未定义该方法,我们仍然可以使用从父类继承(改编)的它的默认实现。

因此,这就是重写和覆盖之间的差异。现在,当你在你的C++项目中遇到这些概念时,你将知道如何区分他们并进行正确的使用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复