【C/C++】3.面向对象编程的特性之多态

在C++中实现多态有两种主要方式:

  1. 编译时多态(静态多态):通常通过函数重载运算符重载来实现。这种多态在编译时已经确定,不需要虚函数。

  2. 运行时多态(动态多态):通过虚函数继承来实现。这种多态在运行时根据实际的对象类型决定调用哪个函数。

 

1. 重写/覆盖(Override)

  • 定义:重写是指在派生类中重新实现基类中的虚函数
  • 特点
    • 函数签名(函数名、参数类型和返回类型)必须和基类中的虚函数完全一致。
    • 主要用于实现运行时多态
    • 必须在基类的虚函数前加 virtual 关键字,子类可以选择性地加 override 关键字明确表示重写。
  • 作用:通过基类指针调用重写的虚函数时,会根据对象的实际类型选择合适的函数。

  示例:

  #include <iostream>
  using namespace std;
  class Animal {
    public: virtual void speak() {  // 父类中的虚函数
      cout << "Animal speaks" << endl;
    }
  };
  class Dog : public Animal {
    public: void speak() override {  // 重写父类的虚函数
      cout << "Dog barks" << endl;
    }
  };
  int main() {
    Animal* animal = new Dog(); // 使用父类指针指向子类对象
    animal->speak(); // 输出:Dog barks delete animal;
    return 0;
  }
 
【注】:

  动态绑定

   当基类中某个函数被声明为virtual时,派生类可以重写该函数,而在通过基类指针或引用访问派生类对象时,会根据实际的对象类型决定调用哪个版本的函数。这种在运行时根据对象的类型调用合适的函数称为动态绑定。

   ->优缺点:

  • 优点
    动态绑定提供了灵活的多态性,可以通过基类指针或引用来调用派生类的不同实现。这种方式使得代码更具可扩展性和可维护性,特别适用于设计接口和抽象基类。

  • 缺点
    动态绑定通常会引入一些运行时开销,例如虚函数表查找所需的时间开销。此外,动态绑定的使用也可能导致编译器优化受限。

 

2. 重载(Overload)

  • 定义:重载是指在同一作用域中定义多个同名但参数列表不同的函数。
  • 特点
    • 函数名相同,但参数个数或类型必须不同。
    • 可以在同一个类中,或在基类与派生类之间。
    • 重载在编译时根据函数的参数列表来决定调用哪个函数,是一种静态多态
  • 作用:提高函数的灵活性和代码可读性,允许使用相同函数名进行不同操作。

  示例:

  #include <iostream>
  using namespace std;
  class Math {
    public:
      int add(int a, int b) { // 重载函数1
        return a + b;
      }
      double add(double a, double b) { // 重载函数2
        return a + b;
      }
  };
posted @ 2024-10-28 22:44  朝槿yys  阅读(7)  评论(0编辑  收藏  举报