回到首页 / 上级目录

多态

C++ 中的多态(Polymorphism)指的是同一个类的不同对象,调用同一个方法时可以产生不同的行为。

C++ 通过虚函数实现多态。

虚函数是一种在基类中声明的函数,它在派生类中被重写,使得派生类能够用自己的方法实现基类的函数。virtual 关键词用于表示该函数是可以被重写的。在调用虚函数时,编译器会根据实际对象的类型来选择调用哪个函数,从而实现多态。

#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;

   // 调用矩形的求面积函数 area
   shape->area();

   // 存储三角形的地址
   shape = &tri;

   // 调用三角形的求面积函数 area
   shape->area();

   return 0;
}

在上述代码中,Shape 是一个基类,其中包含一个虚函数 area(),Rectangle 和 Triangle 是 Shape 的两个派生类,它们都重写了 area() 函数。

在主函数中,首先声明了一个 Shape 类型的指针 shape,然后将其指向 Rectangle 对象,调用了 area() 函数,编译器会根据实际对象的类型来选择调用 Rectangle 类的 area() 函数,输出相应的结果。然后将 shape 指针指向 Triangle 对象,再次调用 area() 函数,编译器会根据实际对象的类型来选择调用 Triangle 类的 area() 函数,输出相应的结果。