在C++中,抽象类和纯虚函数是面向对象编程中的重要概念,尤其在设计类的层次结构和接口时。它们使得开发者能够定义只包含声明而不包含实现的接口,从而允许派生类提供具体的实现。
抽象类:
纯虚函数:
= 0
结尾,表示该函数没有实现。// 抽象基类 Shape,定义了一个纯虚函数 getArea
class Shape {
public:
// 纯虚函数
virtual double getArea() const = 0; // 注意 = 0 表示没有实现
virtual void draw() const {
// 可以有其他的虚函数,这些函数可以有默认实现
std::cout << "Drawing the shape..." << std::endl;
}
};
// 派生类 Circle,实现了基类中的纯虚函数
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// 实现 getArea
double getArea() const override {
return 3.14159 * radius * radius;
}
};
int main() {
// Shape s; // 错误:抽象类不能被实例化
Circle c(5.0); // 正确:Circle 提供了所有纯虚函数的实现
std::cout << "Area: " << c.getArea() << std::endl;
c.draw(); // 调用基类的 draw 函数
return 0;
}
在这个例子中,Shape
是一个抽象基类,它定义了一个纯虚函数 getArea
。Circle
是 Shape
的一个派生类,它提供了 getArea
的具体实现。由于 Shape
包含纯虚函数,因此它不能被实例化。但是,Circle
提供了所有纯虚函数的实现,所以它可以被实例化,并且可以通过 Circle
对象调用这些函数。
C++为什么要引入纯虚函数和抽象类?自己感觉主要是下面两点:
- 强制要求派生类提供特定功能的实现,从而确保多态性的正确应用。
- 设计上可以描述一组相关类的共同接口,这样客户端代码可以通过基类指针或引用调用这些方法,而不必关心具体的派生类类型。