C++抽象类(接口)
【欢迎关注编码小哥,学习更多实用的编程方法和技巧】
在C++中,接口通常是通过抽象类来实现的。抽象类至少包含一个纯虚函数,这意味着派生类必须实现这个函数。下面是一个简单的例子,展示了如何定义一个接口抽象类以及如何通过派生类来实现它。
代码举例
// 声明一个接口抽象类
class IShape{
public:
// 纯虚函数,表示计算面积的操作
virtual double area() const = 0;// 虚析构函数,确保派生类对象销毁时能够调用正确的析构函数
virtual ~IShape() {}
};// 实现接口的具体类:圆形
class Circle : public IShape{
private:
double radius;public:
Circle(double r) : radius(r) {}// 实现接口中的纯虚函数
double area() const override{
return 3.14159 * radius * radius;
}
};// 实现接口的具体类:矩形
class Rectangle : public IShape{
private:
double width, height;public:
Rectangle(double w, double h) : width(w), height(h) {}// 实现接口中的纯虚函数
double area() const override{
return width * height;
}
};int main()
{
// 创建圆形和矩形对象
Circle circle(5);
Rectangle rectangle(3, 6);// 使用基类指针指向派生类对象
IShape* shapes[] = {&circle, &rectangle};// 通过基类指针调用派生类的方法
for (const auto& shape : shapes){
std::cout << "Area: " << shape->area() << std::endl;
}return 0;
}
在这个例子中,IShape是一个接口抽象类,它定义了一个纯虚函数area()。Circle和Rectangle类继承自IShape并实现了area()函数。在main()函数中,我们创建了一个指向IShape的指针数组,这个数组包含了Circle和Rectangle对象的地址。通过这些基类指针,我们可以调用派生类的area()方法,这就是多态的体现。
注意
为了确保通过基类(父类)指针删除派生类(子类)对象时能够正确地调用派生类的析构函数,我们在抽象类中提供了一个虚析构函数。这是一个良好的编程习惯,即使它是空的。