📅  最后修改于: 2023-12-03 14:40:14.899000             🧑  作者: Mango
在 C++ 中,可以通过类的成员函数和访问限定符来实现抽象。抽象类是不能被实例化的类,它只用于提供接口和规范。一个抽象类必须至少包含一个纯虚函数,否则它与普通类没有任何区别。
抽象类的定义方式为在类中将至少一个函数声明为纯虚函数。形式如下:
class AbstractClass {
public:
virtual void pure_virtual_fn() = 0;
// 此处 "= 0" 表示这是纯虚函数,没有实现体
};
在上述代码中,pure_virtual_fn()
是一个纯虚函数。它没有函数体,其中的 = 0
告诉编译器不需要为该函数生成代码。
一个类中只要包含了纯虚函数,就称其为抽象类。抽象类无法直接被实例化:
AbstractClass ac; // 错误!不能直接实例化抽象类
抽象类通常用于定义一组接口规范,让其他类来实现这些接口。举例如下:
class Shape {
public:
// 计算面积(纯虚函数)
virtual double area() const = 0;
// 计算周长(纯虚函数)
virtual double perimeter() const = 0;
};
class Rectangle : public Shape {
public:
Rectangle(double width, double height)
: width_(width), height_(height)
{}
double area() const override {
return width_ * height_;
}
double perimeter() const override {
return 2 * (width_ + height_);
}
private:
double width_;
double height_;
};
class Circle : public Shape {
public:
Circle(double radius) : radius_(radius) {}
double area() const override {
return PI * radius_ * radius_;
}
double perimeter() const override {
return 2 * PI * radius_;
}
private:
const double PI = 3.14159265358979323846;
double radius_;
};
在这个例子中,Shape
定义了一组接口规范,让其他类来实现它们。Rectangle
和 Circle
继承于 Shape
,并实现了其中的纯虚函数。这样,在程序中就可以通过 Shape*
指针来指向 Rectangle
或 Circle
的实例,并调用其接口:
std::vector<Shape*> shapes = {new Rectangle(3, 4), new Circle(1.5)};
for (auto s : shapes) {
std::cout << "Area: " << s->area() << std::endl;
std::cout << "Perimeter: " << s->perimeter() << std::endl;
}
通过定义抽象类和纯虚函数,可以使类变得抽象化,只提供接口和规范。这在大型程序中非常有用,因为它可以使不同的代码模块之间保持松耦合,同时又能够保证整个程序的一致性。