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

C++抽象类

C++抽象类

了解了多态的基本作用和实现原理之后接下来就可以认识C++面向对象编程中实现接口规范多态设计的核心机制——抽象类,它通过纯虚函数定义行为契约,为派生类提供统一的接口框架

纯虚函数

前面我们了解了虚函数的格式

virtual void print() { ...... }

纯虚函数的格式与虚函数相差不大,格式为

virtual void test() = 0;

特点

  • 含有纯虚函数的类称为抽象类

  • 抽象类不能实例化

#include <iostream>​using namespace std;​class A{public:virtual void test() = 0;};​int main(){//抽象类实例化程序报错A a;return 0;}

抽象类的作用

由于继承抽象类的子类必须要实现父类纯虚函数,因此抽象类通常充当功能接口或者类接口

#include <iostream>​using namespace std;​//抽象类class A{public:virtual void test() = 0;};​//派生类class B : public A{public:void test(){cout << "print B" << endl;}};​//派生类class C : public A{public:void test(){cout << "print C" << endl;}};​int main(){//由于此时B类和C类内的test都为虚函数,所以需要通过指针来访问A *pa = new B();pa->test();return 0;}

输出结果

上述代码展示了抽象类的基本用法,其中test函数在不同类中被赋予了不同功能

抽象类的实际应用

假设现在你是某公司的程序员,你们公司现在打算开发一个聊天室项目,此时你的项目经理找到了你,他要求你实现用户登录和注册功能,收到任务后你就开始着手实现功能,你声明了一个client类,类中包含了log函数和reg函数,分别实现登录和注册功能

项目经理调用相应函数时操作如下

int main(){//实例化对象client *p = neww client();//通过实例对象来调用相应函数p->log();p->reg();}

假设此时项目经理觉得你的功能做的并不好,他又把相同的功能交给了另一个人去做,另一个人做好后将代码发给了项目经理,但是此时面临的问题是,另一个人实现的方法与你并不相同,类名,函数名,函数参数都发生了改变,此时项目经理需要将之前调用过你代码的每一个地方都修改掉,这就是一件开销比较大的事情了

但实际上的开发流程并没有这么随意,如果向上述过程进行开发的话当代码完成后,如果项目经理想要使用你的类内函数,他就需要了解你的函数是如何实现的,包括函数参数等等

因此实际开发中项目经理可能会给你一个抽象类

class Absclient{public:virtual void log(char *name, char *passwd) = 0;virtual void reg(char * name) = 0;};

此时你再实现相关功能时只需要创建一个派生类来继承这个抽象类,然后你就可以在派生类中实现相应的功能了

class client : public Absclient{void log(char *name, char *passwd){......}void reg(char *name){......}}

当项目经理想要调用相应函数时只需要

int main{//使用指针指定派生类对象Absclient *p = new client();//根据指针实际指向的对象类型来调用相应的函数实现p->log("zhangsan", "123");p->reg("lisi");return 0;}

当项目经理对你的功能不满意并让其他人实现操作之后,另一个人也是按照抽象类的格式来写的,因此,项目经理顶多只要修改一下类名,其他的都不用动,这就是使用抽象类的好处

http://www.xdnf.cn/news/19377.html

相关文章:

  • 【Python 后端框架】总结
  • Nginx反向代理与负载均衡
  • 基于单片机指纹考勤系统/智能考勤
  • DeepSeek应用技巧-通过MCP打造数据分析助手
  • YOLOv11 训练参数全解析:一文掌握 epochs、batch、optimizer 调优技巧
  • kali下sqlmap更新失败问题
  • PB-重装系统后,重新注册ole控件,pb中窗口控件失效的问题。
  • 不用公网IP也能?cpolar实现Web-Check远程安全检测(1)
  • 2025年09月计算机二级MySQL选择题每日一练——第十二期
  • 数据结构 | 深度解析二叉树的基本原理
  • 云存储(参考自腾讯云计算工程师认证)
  • 整体设计 的语言设计:通用模型语言的标准模板语言的规格模式语言--含输出(腾讯元宝答问)
  • 漏洞挖掘-信息收集教程
  • 阿里云营业执照OCR接口的PHP实现与技术解析:从签名机制到企业级应用
  • Jdk动态代理 Cglib动态代理
  • Linux 定时器:工作原理与实现机制深入分析
  • STL库——list(类模拟实现)
  • 复制VMware虚拟机后的网络配置
  • 算法---动态规划(持续更新学习)
  • k230 按键拍照后,将摄像头拍照的1920*1080分辨率的图片以jpg文件格式,保存到板载TF存储卡的指定文件夹目录中
  • 营业执照经营范围行业提取工具库项目方案解读(php封装库)
  • 项目管理在企业中的作用
  • Python 多线程日志错乱:logging.Handler 的并发问题
  • 什么是IO多路复用
  • ESPTimer vs GPTimer:ESP32 定时器系统深度解析
  • 【Java基础知识 19】继承
  • Spring注解演进与自动装配原理深度解析:从历史发展到自定义Starter实践
  • 197-200CSS3响应式布局,BFC
  • 内存管理(智能指针,内存对齐,野指针,悬空指针)
  • 时间轴组件开发:实现灵活的时间范围选择