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;
 }

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

相关推荐
浪客灿心15 分钟前
项目篇:模块设计与实现
数据库·c++
牛油果子哥q27 分钟前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
为何创造硅基生物2 小时前
独占指针的创建std::make_unique 本身自带堆出现
c++
kyle~3 小时前
ROS 2 与 Isaac Sim 联合仿真(一)体系架构、环境选型与基础通信闭环
c++·机器人·nvidia·仿真·ros2
努力努力再努力wz3 小时前
【内存管理与高并发内存池系列】从 mmap 到 malloc:文件映射、匿名映射与 glibc 内存分配机制详解
linux·c语言·数据结构·数据库·c++·qt·链表
J2虾虾3 小时前
C 语言 void 完全用法
c语言·开发语言
八解毒剂3 小时前
数据结构-平衡二叉树——对二叉搜索树的优化
数据结构·c++·算法
wu_ye_m3 小时前
学习c语言第35天 函数声明和定义
c语言·开发语言·学习
起床困难户5754 小时前
条款20:协助完成返回值优化
c++
啦啦啦啦啦zzzz4 小时前
算法总结(二分查找、双指针)
c++·算法