如何理解C++中的多态?
C++中的多态是面向对象程序设计中的一种重要概念,它允许不同类型的对象对相同的消息做出不同的响应。多态是通过派生类继承基类的虚函数来实现的。
在C++中,多态有两种形式:静态多态和动态多态。其中,静态多态是指函数重载,而动态多态则是指虚函数实现的运行时多态。
静态多态
静态多态是指函数的重载,它可以使得一个函数名可以代表不同的功能。这样,在编译时就会根据调用参数的不同来选择正确的函数进行调用。
例如,我们可以定义一个名为 sum 的函数,它可以接收不同数量和类型的参数,从而实现加法操作。通过使用函数重载,可以重复使用函数名 sum,避免了代码冗余。
int sum(int a, int b) { return a + b; }
double sum(double a, double b) { return a + b; }
动态多态
动态多态是指利用虚函数实现的运行时多态。在C++中,可将基类指针或引用指向派生类对象,并调用其虚函数,从而实现运行时动态绑定。这种方式下,程序会根据对象的实际类型来选择正确的函数进行调用,从而实现多态。
class Shape {
public:
virtual double getArea() = 0;
};
class Rectangle: public Shape {
public:
double getArea() { return width * height; }
private:
int width;
int height;
};
class Triangle: public Shape {
public:
double getArea() { return 0.5 * base * height; }
private:
int base;
int height;
};
int main() {
Shape* shape = new Rectangle();
std::cout << "Area of Rectangle is: " << shape->getArea() << std::endl;
shape = new Triangle();
std::cout << "Area of Triangle is: " << shape->getArea() << std::endl;
return 0;
}
在上面的示例中,我们定义了一个基类 Shape,其中包含一个纯虚函数 getArea()。然后,我们定义了两个派生类 Rectangle 和 Triangle,它们分别实现了 getArea() 函数。
在 main() 函数中,我们首先将一个基类指针指向一个 Rectangle 对象,并调用其虚函数 getArea(),输出矩形的面积。然后,我们将同一个基类指针指向一个 Triangle 对象,并再次调用 getArea() 函数,输出三角形的面积。由于 getArea() 是虚函数,所以程序会根据对象的实际类型选择正确的函数进行调用,从而实现动态多态。