当前位置: 首页 > article >正文

什么是抽象类?是所有函数都是纯虚函数吗?

什么是抽象类?

抽象类(Abstract Class)是一种特殊的类,它不能被直接实例化,但可以作为基类被其他类继承。抽象类的主要用途是定义一组接口规范,这些规范由派生类实现。

在C++中,抽象类是通过包含至少一个纯虚函数(Pure Virtual Function)来定义的。纯虚函数是一种没有具体实现的虚函数,它要求派生类必须提供具体的实现(除非派生类本身也是抽象类)。

抽象类并不是所有函数都是纯虚函数,它也可以包含普通虚函数和普通成员函数。

  • 抽象类:不能实例化的类,至少包含一个纯虚函数。
  • 纯虚函数:没有具体实现的虚函数,必须由派生类实现。
  • 普通虚函数:可以有默认实现,派生类可以选择覆盖。

抽象类的定义

抽象类的定义形式如下:

class AbstractClass {
public:virtual void pureVirtualFunction() = 0; // 纯虚函数virtual void normalVirtualFunction() { /* 默认实现 */ } // 普通虚函数
};

抽象类的特点

  1. 不能实例化

    • 抽象类不能直接创建对象。如果尝试实例化抽象类,编译器会报错。
    • 例如:
      AbstractClass obj; // 错误:不能实例化抽象类
      
  2. 包含纯虚函数

    • 抽象类至少包含一个纯虚函数。纯虚函数的声明形式为 virtual 返回类型 函数名() = 0;
    • 例如:
      virtual void pureVirtualFunction() = 0;
      
  3. 可以包含普通成员函数和普通虚函数

    • 抽象类可以包含普通成员函数和普通虚函数,这些函数可以有默认实现。
    • 例如:
      virtual void normalVirtualFunction() { /* 默认实现 */ }
      
  4. 可以包含数据成员

    • 抽象类可以包含数据成员,这些数据成员可以被派生类继承和访问。

抽象类的示例

示例1:包含纯虚函数的抽象类
class AbstractClass {
public:virtual void pureVirtualFunction() = 0; // 纯虚函数
};class Derived : public AbstractClass {
public:void pureVirtualFunction() override {std::cout << "Derived pureVirtualFunction()" << std::endl;}
};int main() {// AbstractClass obj; // 错误:不能实例化抽象类Derived d;d.pureVirtualFunction(); // 输出:Derived pureVirtualFunction()return 0;
}
示例2:包含普通虚函数的抽象类
class AbstractClass {
public:virtual void pureVirtualFunction() = 0; // 纯虚函数virtual void normalVirtualFunction() { // 普通虚函数std::cout << "AbstractClass normalVirtualFunction()" << std::endl;}
};class Derived : public AbstractClass {
public:void pureVirtualFunction() override {std::cout << "Derived pureVirtualFunction()" << std::endl;}void normalVirtualFunction() override {std::cout << "Derived normalVirtualFunction()" << std::endl;}
};int main() {Derived d;d.pureVirtualFunction(); // 输出:Derived pureVirtualFunction()d.normalVirtualFunction(); // 输出:Derived normalVirtualFunction()return 0;
}

抽象类的作用

  1. 定义接口规范

    • 抽象类通过纯虚函数定义了一组接口规范,这些规范必须由派生类实现。这确保了派生类具有一致的行为。
  2. 提供默认实现

    • 抽象类可以包含普通虚函数和普通成员函数,这些函数可以提供默认实现,派生类可以选择覆盖或直接使用。
  3. 多态性

http://www.lryc.cn/news/2384482.html

相关文章:

  • 计算机视觉与深度学习 | Python实现ARIMA-WOA-CNN-LSTM时间序列预测(完整源码和数据
  • 【Unity实战笔记】第二十四 · 使用 SMB+Animator 实现基础战斗系统
  • C/C++的OpenCV 进行图像梯度提取
  • Redis 缓存使用的BigKey问题
  • 【Java高阶面经:消息队列篇】22、消息队列核心应用:高并发场景下的解耦、异步与削峰
  • 软媒魔方——一款集合多种系统辅助组件的软件
  • Unity场景的加载与卸载
  • 多路径可靠传输协议(比如 MPTCP)为什么低效
  • 塔能高温冰蓄冷技术:工厂能耗精准节能的创新之路
  • 内存优化笔记1
  • 人脸识别,使用 deepface + api + flask, 改写 + 调试
  • 代码管理平台Gitlab如何通过快解析实现远程访问?
  • 基于SpringBoot+Vue的足球青训俱乐部管理后台系统的设计与开发
  • Redis 是否适合像 MySQL 一样当数据库使用?
  • AI是否会取代人类?浔川问答①
  • JDBC-java操作数据库
  • [原创](现代Delphi 12指南):[macOS 64bit App开发]: 如何获取目录大小?
  • 线程调度与单例模式:wait、notify与懒汉模式解析
  • MySQL中TCP和套接字SSL加密连接行为分析
  • php本地 curl 请求证书问题解决
  • Callable
  • Honeywell 05701-A-0302 单通道控制卡
  • 爱普生晶振赋能UWB汽车数字钥匙,解锁未来出行新方式
  • 电子电路:深入理解电磁耦合的定义与应用
  • 宝塔安装的 MySQL 无法连接的情况及解决方案
  • 今日行情明日机会——20250523
  • 微服务项目->在线oj系统(Java版 - 4)
  • ReAct 与 CoAct:AI 代理的推理与行动之旅
  • 电子电路:什么是滤波器,什么优势高通滤波器?
  • uni-app使用大集