抽象类(Abstract class)是C++面向对象中的一个重要概念,它不能被实例化,必须被子类继承,并且子类必须实现父类中的抽象方法才能被实例化。抽象类是用于表达一组类的通用特征,具有相似行为的方法,但又不能实例化的情况下。
抽象类在C++中是通过定义纯虚函数(pure virtual function)来实现的。纯虚函数即没有函数体的虚函数,它通过在函数声明后加上= 0
来定义。抽象类可以包含非纯虚函数和数据成员,但是不允许对纯虚函数提供实现。
例如,下面是一个简单的抽象类Shape
的示例,其中包含一个纯虚函数area()
:
class Shape {
protected:
double width;
double height;
public:
Shape(double w, double h) {
width = w;
height = h;
}
virtual double area() = 0;
};
可以看到,Shape
类中通过定义一个width
和一个height
属性来描述所有的形状,在构造函数中完成了它们的初始化工作。在该类中还定义了一个抽象方法area()
,用于计算形状的面积。由于面积计算方法与形状有关,具体的实现需要交给子类去实现。
接下来我们可以创建一个正方形子类Square
,它继承自Shape
,并实现了area()
方法计算正方形的面积,如下所示:
class Square : public Shape {
public:
Square(double width) : Shape(width, width) {}
double area() {
return width * width;
}
};
可以看到,在Square
类中通过构造函数初始化了Shape
类中的width
和height
属性,并实现了area()
方法用于计算正方形的面积。这就是抽象类的典型应用场景:定义相似的行为方法,但不做具体的实现,以便子类继承和扩展。
下面再给出一个例子,实现基于抽象类实现的简单的形状工厂实例。假设我们有一个抽象的ShapeFactory
类,其中包含一个工厂方法create()
,该方法返回一个Shape
对象指针。接下来的CircleFactory
和SquareFactory
两个子类,继承自ShapeFactory
,并分别实现create()
方法,返回对应的形状对象指针。示例代码如下所示:
class ShapeFactory {
public:
virtual Shape* create() = 0;
};
class CircleFactory : public ShapeFactory {
public:
Shape* create() {
return new Circle(5);
}
};
class SquareFactory : public ShapeFactory {
public:
Shape* create() {
return new Square(3);
}
};
当调用create()
方法时,再根据需要创建具体的形状对象实例,这样就可以用抽象的ShapeFactory
来统一创建各种形状对象了。
总之,抽象类是C++面向对象编程中的基本概念,通过定义抽象方法可以清晰地表达各种对象之间的通用特征和行为,从而实现代码的重用和扩展。