21xrx.com
2024-12-22 20:50:07 Sunday
登录
文章检索 我的文章 写文章
C++重载、重写、覆盖的区别解析
2023-07-10 16:14:45 深夜i     --     --
C++ 重载 重写 覆盖 区别

在C++中,有三个常见的概念是重载、重写和覆盖。这些概念在面向对象编程中很重要,因此本文将对它们的区别进行解析。

1. 重载(Overloading)

C++中的重载是指在同一作用域内,可以有多个同名但参数列表不同的函数。例如:


int add(int a, int b);

float add(float a, float b);

这两个函数的名称相同,但是它们的参数列表不同,一个接收两个整数,另一个接收两个浮点数。编译器能够根据函数的参数列表,在调用时选择正确的函数。

2. 重写(Overriding)

重写是面向对象编程中的一个概念,指的是在派生类中重新定义父类中已有的虚函数,以便满足派生类的需要。例如:


class animal {

 public:

  virtual void sound() cout << "animal sound" << endl;

};

class dog : public animal {

 public:

  void sound() override cout << "dog sound" << endl;

};

int main() {

 animal* myAnimal = new dog;

 myAnimal->sound();

 return 0;

}

在这个示例中,`animal`类中有一个名为`sound`的虚函数。然后我们创建一个派生类`dog`,它重新定义了`sound`函数,使其输出“dog sound”。最后,我们创建了一个指向`dog`对象的`animal`指针,并调用`sound`函数。由于重写了虚函数,程序输出“dog sound”。

3. 覆盖(Hiding)

覆盖指的是在派生类中定义同名但与父类中的函数不同的非虚函数。例如:


class animal {

 public:

  void sound() cout << "animal sound" << endl;

};

class dog : public animal {

 public:

  void sound() cout << "dog sound" << endl;

};

int main() {

 animal* myAnimal = new dog;

 myAnimal->sound();

 return 0;

}

与之前的示例相比,这里的`sound`函数不是虚函数。我们派生了一个`dog`类,它重新定义了`sound`函数使其输出“dog sound”。然后我们创建了一个指向`dog`对象的`animal`指针,并调用`sound`函数。由于`sound`函数被覆盖,程序输出“animal sound”。

综上,重载、重写和覆盖都是C++中常见的概念。重载适用于函数,可以在同一作用域中定义多个同名但参数列表不同的函数。重写适用于派生类和虚函数,可以在派生类中重新定义父类中已有的虚函数。覆盖适用于派生类和非虚函数,可以在派生类中定义与父类中同名但不同的非虚函数。了解这些概念的区别和用法,有助于我们编写出更好的C++程序。

  
  

评论区

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