C++中的纯虚函数与抽象类解析

需积分: 15 1 下载量 5 浏览量 更新于2024-07-23 收藏 229KB PPT 举报
"本文将详细介绍C++中的虚函数与抽象类概念,以及静态联编和动态联编的区别。" 在C++编程语言中,多态性是面向对象设计的重要特性,它允许我们编写更通用、可扩展的代码。多态性主要通过虚函数和抽象类来实现。下面我们将逐一探讨这些概念。 6.2 虚函数 虚函数是C++中实现多态性的一种机制。当在一个基类指针或引用上调用虚函数时,实际调用的是指向对象的派生类中的重写版本,而非基类的版本。这种行为被称为动态绑定或运行时多态。例如: ```cpp class Base { public: virtual void print() { cout << "Base::print()" << endl; } }; class Derived : public Base { public: void print() override { cout << "Derived::print()" << endl; } }; Base* base_ptr = new Derived(); base_ptr->print(); // 输出 "Derived::print()" ``` 在这个例子中,`base_ptr` 指向一个 `Derived` 对象,即使调用 `print()` 函数是通过基类指针,实际执行的是 `Derived` 类的版本。 6.3 纯虚函数和抽象类 纯虚函数是在基类中声明但没有实现的虚函数,其定义形式为 `virtual void func() = 0;`。含有纯虚函数的类被称为抽象类,不能被实例化,但可以作为其他类的基类。抽象类的主要作用是定义一个接口,供派生类实现。例如: ```cpp class Shape { public: virtual double area() const = 0; // 纯虚函数 }; class Circle : public Shape { public: Circle(double radius) : r(radius) {} double area() const override { return PI * r * r; } private: double r; }; class Rectangle : public Shape { public: Rectangle(double length, double width) : l(length), w(width) {} double area() const override { return l * w; } private: double l, w; }; ``` 在这里,`Shape` 是一个抽象类,它定义了 `area()` 纯虚函数,而 `Circle` 和 `Rectangle` 派生自 `Shape` 并实现了 `area()` 函数。 6.1 静态联编和动态联编 静态联编(也称为早期绑定)在编译阶段完成,根据函数调用时的类型信息确定调用哪个函数。而动态联编(也称为晚期绑定或运行时绑定)则在程序运行时根据对象的实际类型决定调用哪个函数,通常与虚函数相关。例如,`f1` 函数中的 `r.Print()` 调用就是静态联编,因为 `Print` 函数不是虚函数;而在 `Base` 和 `Derived` 的例子中,`print` 被声明为虚函数,所以调用是动态联编。 6.4 运算符重载 运算符重载允许我们为自定义类型定义特定的运算符行为。例如,我们可以为 `Figure` 类及其派生类定义加法运算符,使得两个图形的面积可以相加: ```cpp class Figure { public: // ... 其他成员 ... Figure operator+(const Figure& other) const { return Figure(this->area() + other.area()); } }; ``` 这样,两个 `Figure` 对象就可以通过 `+` 运算符合并它们的面积。 总结来说,虚函数和抽象类提供了C++中的动态多态性,而静态联编和动态联编是两种不同的函数调用方式。理解这些概念对于编写高效、灵活的面向对象代码至关重要。