C++的多态性:编译时与运行时

需积分: 49 2 下载量 122 浏览量 更新于2024-07-14 收藏 1.95MB PPT 举报
面向对象程序设计中的多态性是C++语言的一大特性,它允许我们编写更加灵活和可扩展的代码。C++支持两种主要的多态性形式:编译时多态和运行时多态。 **编译时多态**主要是通过**函数重载**实现。函数重载是指在同一个作用域内,可以有多个同名函数,它们的参数列表不同(参数数量、类型或顺序不同),编译器根据调用时传递的参数自动选择合适的函数进行调用。这种多态性在编译阶段就已经确定,因此也称为静态多态或早期绑定。 例如,我们可以定义两个重载的`add`函数,一个接受两个整数,另一个接受两个浮点数: ```cpp int add(int a, int b) { return a + b; } double add(double a, double b) { return a + b; } ``` 在编译期间,编译器会根据调用`add`函数时传入的参数类型来决定使用哪个版本的`add`。 **运行时多态**主要是通过**虚函数**实现。虚函数是在基类中声明的,并且在派生类中可能被重写。这种机制使得通过基类指针或引用调用派生类的成员函数成为可能,即使在编译时并不知道具体的派生类类型。这被称为动态多态或晚期绑定。 例如: ```cpp class Base { public: virtual void display() { cout << "Base\n"; } }; class Derived : public Base { public: void display() override { cout << "Derived\n"; } }; int main() { Base* basePtr = new Derived(); basePtr->display(); // 运行时调用Derived的display delete basePtr; return 0; } ``` 在这个例子中,`basePtr`是基类`Base`的指针,但它指向的是派生类`Derived`的对象。当我们通过`basePtr`调用`display`函数时,由于`display`在`Base`中被声明为虚函数,所以实际调用的是`Derived`中的`display`函数,这是运行时多态的体现。 **纯虚函数**和**抽象类**是C++中实现多态的另一种方式。纯虚函数是在基类中声明的虚函数,不提供具体实现,它的目的是让基类成为一个抽象接口。如果一个类包含至少一个纯虚函数,那么这个类被称为抽象类,不能实例化,但可以作为其他类的基类。抽象类通常用于定义接口,强制派生类实现特定的虚函数。 例如: ```cpp class Shape { public: virtual ~Shape() {} virtual void draw() = 0; // 纯虚函数 }; class Circle : public Shape { public: void draw() override { cout << "Drawing a circle\n"; } }; class Square : public Shape { public: void draw() override { cout << "Drawing a square\n"; } }; ``` `Shape`是抽象类,`draw`是一个纯虚函数。`Circle`和`Square`都继承自`Shape`并提供了`draw`的实现。现在,我们可以使用`Shape`指针来调用不同形状的`draw`方法,实现了多态性。 总结来说,C++的多态性使得代码能够以一种统一的方式处理不同类型的对象,提高了代码的复用性和可扩展性。编译时多态通过函数重载实现,而运行时多态主要依赖于虚函数。通过这两种多态形式,开发者可以设计出更加灵活和面向对象的程序。