C++抽象基类定义与使用

打印 上一主题 下一主题

主题 1676|帖子 1676|积分 5028

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
在 C++ 中,抽象基类(Abstract Base Class, ABC) 是一种特殊的类,用于定义接口规范和束缚派生类的行为。它通过纯虚函数(Pure Virtual Function)强制要求派生类实现特定功能,自身不能被实例化。以下是抽象基类的核心概念和使用方法:

1. 定义抽象基类

抽象基类必须包含至少一个 纯虚函数,语法为在虚函数声明后添加 = 0:
  1. class Shape {
  2. public:
  3.     // 纯虚函数:没有实现,必须由派生类覆盖
  4.     virtual double area() const = 0;
  5.     virtual double perimeter() const = 0;
  6.     // 普通虚函数(可选,可提供默认实现)
  7.     virtual void printInfo() const {
  8.         std::cout << "This is a shape." << std::endl;
  9.     }
  10.     // 虚析构函数(必须!确保正确释放资源)
  11.     virtual ~Shape() = default;
  12. };
复制代码

2. 抽象基类的特性



  • 不可实例化:抽象基类不能直接创建对象。
    1. Shape s;  // 错误:无法实例化抽象类
    复制代码
  • 强制派生类实现接口:派生类必须覆盖全部纯虚函数,否则仍是抽象类。
  • 支持多态:通过基类指针或引用操作派生类对象。

3. 派生类实现示例

  1. class Circle : public Shape {
  2. private:
  3.     double radius;
  4. public:
  5.     Circle(double r) : radius(r) {}
  6.     // 必须实现基类的纯虚函数
  7.     double area() const override {
  8.         return 3.14159 * radius * radius;
  9.     }
  10.     double perimeter() const override {
  11.         return 2 * 3.14159 * radius;
  12.     }
  13.     // 可覆盖基类的普通虚函数(可选)
  14.     void printInfo() const override {
  15.         std::cout << "This is a circle." << std::endl;
  16.     }
  17. };
复制代码

4. 使用抽象基类实现多态

  1. int main() {
  2.     Shape* shape = new Circle(5.0);
  3.    
  4.     // 调用派生类实现的函数
  5.     std::cout << "Area: " << shape->area() << std::endl;      // 输出圆的面积
  6.     std::cout << "Perimeter: " << shape->perimeter() << std::endl;
  7.     shape->printInfo();  // 调用派生类的 printInfo()
  8.     delete shape;
  9.     return 0;
  10. }
复制代码

5. 关键注意事项



  • 虚析构函数:基类的析构函数必须声明为虚函数,确保正确释放派生类资源。
  • 接口规范:抽象基类用于定义通用接口,强制派生类遵守统一行为。
  • 纯虚函数的默认实现(C++11 起):
    1. virtual void someFunction() const = 0 { /* 默认实现 */ }
    复制代码
    派生类可通过 BaseClass::someFunction() 调用默认实现。

6. 抽象基类 vs 接口



  • 抽象基类:可以包含数据成员、平凡成员函数和纯虚函数。
  • 接口(类似 Java):仅包含纯虚函数(无数据成员和平凡函数),但 C++ 中通过纯抽象类模拟:
    1. class ISerializable {
    2. public:
    3.     virtual void serialize() const = 0;
    4.     virtual void deserialize() = 0;
    5.     virtual ~ISerializable() = default;
    6. };
    复制代码

总结

抽象基类是 C++ 实现多态和接口规范的核心工具,通过纯虚函数强制派生类实现特定功能,确保代码的同等性和可扩展性。它在计划模式(如工厂模式、策略模式)和大型项目架构中广泛应用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

万万哇

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表