C++ 接口是使用抽象类来实现的。抽象类通常用于表示概念或设计模式;
抽象类的定义
-
抽象类:
- 抽象类是一种包含至少一个纯虚函数的类,不能被实例化。
- 通常用于定义接口,强制派生类提供某些特定的行为。
-
纯虚函数:
- 声明为
virtual
,并在函数声明的末尾加上= 0
。 - 这是告诉编译器,该函数的实现需要在派生类中提供。
- 声明为
纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:
class AbstractClass {
public:
// 纯虚函数
virtual void pureVirtualFunction() = 0;
// 普通成员函数(可选)
void normalFunction() {
// 实现
}
};
//具体示例,展示了如何使用抽象类和纯虚函数来实现一个简单的形状系统,包括一个抽象基类和两个派生类:
#include <iostream>
#include <cmath>
// 抽象类
class Shape {
public:
// 纯虚函数
virtual void draw() = 0; // 紧凑的图形绘制
virtual double area() = 0; // 计算面积
};
// 派生类: Circle
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
void draw() override {
std::cout << "Drawing a circle with radius: " << radius << std::endl;
}
double area() override {
return M_PI * radius * radius; // 返回圆的面积
}
};
// 派生类: Rectangle
class Rectangle : public Shape {
private:
double width, height;
public:
Rectangle(double w, double h) : width(w), height(h) {}
void draw() override {
std::cout << "Drawing a rectangle with width: " << width << " and height: " << height << std::endl;
}
double area() override {
return width * height; // 返回矩形面积
}
};
int main() {
// 创建形状的指针
Shape* shape1 = new Circle(5.0);
Shape* shape2 = new Rectangle(4.0, 6.0);
// 绘制形状并计算面积
shape1->draw();
std::cout << "Area: " << shape1->area() << std::endl;
shape2->draw();
std::cout << "Area: " << shape2->area() << std::endl;
// 释放内存
delete shape1;
delete shape2;
return 0;
}
关键点总结
-
抽象类不能实例化:
- 尝试创建一个抽象类的对象会引发编译错误。
-
派生类必须重写纯虚函数:
- 如果派生类没有提供纯虚函数的实现,它仍然会被视为抽象类,并且不能被实例化。
-
使用抽象类实现多态:
- 抽象类是实现多态的一种主要方式,可以使用基类指针或引用来指向派生类对象,并调用其实现。
-
抽象类可包含正常成员:
- 除了纯虚函数外,抽象类还可以包含普通成员函数、构造函数和成员变量。
使用场景
- 抽象类通常用于建立统一的接口,为多个派生类提供共同的行为。在大多数大型软件系统中,抽象类是设计模式的重要组成部分,帮助设计者更好地组织和管理代码。