C++ 多态


C++ 多态

多态是面向对象编程中的一个重要概念,它允许不同的对象对同一个消息作出不同的响应。C++ 中的多态性可以通过虚函数来实现。

虚函数是在基类中声明的函数,它可以在派生类中进行重定义。当基类指针指向派生类对象并调用虚函数时,将调用派生类中的函数,而不是基类中的函数。这正是多态的核心。

虚函数的声明方式为:

virtual 返回类型 函数名(参数列表);

注意:虚函数的重载(overload)和重定义(override)是两个不同的概念。重载是指在同一个类中定义的函数名相同,但参数列表不同的多个函数;而重定义是指派生类中的函数与基类中的函数具有相同的名称和参数列表。

使用多态的好处是程序可以更灵活和扩展,例如可以通过将一个基类指针指向不同的派生类实现代码复用和扩展。但需要注意的是,虚函数调用的执行效率可能会比非虚函数慢一些,因此需要谨慎使用。

以下是一个使用多态的示例:

#include <iostream>
using namespace std;

class Shape {
   protected:
      int width, height;

   public:
      Shape( int a = 0, int b = 0) {
         width = a;
         height = b;
      }

      virtual int area() {
         cout << "Parent class area :" <<endl;
         return 0;
      }
};

class Rectangle: public Shape {
   public:
      Rectangle( int a = 0, int b = 0):Shape(a, b) { }

      int area () {
         cout << "Rectangle class area :" <<endl;
         return (width * height);
      }
};

class Triangle: public Shape {
   public:
      Triangle( int a = 0, int b = 0):Shape(a, b) { }

      int area () {
         cout << "Triangle class area :" <<endl;
         return (width * height / 2);
      }
};

int main( ) {
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   shape = &rec;
   shape->area();

   shape = &tri;
   shape->area();

   return 0;
}

上述代码中,我们定义了一个基类 Shape,它有一个虚函数 area();同时我们派生了两个类 Rectangle 和 Triangle,并对基类中的 area() 函数进行了重定义。

在 main 函数中,我们定义了一个基类指针 shape,并通过指向不同的派生对象实现多态性。在调用 area() 函数时,由于它是虚函数,程序会自动选择正确的函数实现。

输出结果为:

Parent class area :
Parent class area :

显然,由于 area() 函数是虚函数,因此调用了派生类中重定义的函数,输出不同的结果。

总结:与其他对象导向语言类似,C++的多态也是通过虚函数多态来实现的。虚函数是在基类中声明的函数,它可以在派生类中进行重定义。通过定义一个基类指针并指向不同的派生类,在调用虚函数时可实现多态性。在使用多态时需要注意程序的效率问题,需要权衡利弊。