【C++深度剖析教程30】C++中抽象类和接口

加qq1126137994 微信:liu1126137994

1、面向对象中的抽象概念;
这里写图片描述

在现实中,需要知道具体的图形类型才能知道如何求面积,但是对于抽象的‘图形’,我们是没法求其面积的,而且对其求面积也是没有意义的:

class shape
{
public:double area(){return 0;}
};

shape 只是一个概念上的类型,没有对象!!!
2、那么什么是抽象类呢?

面向对象中的抽象类:

  • 可用于表示现实世界中的抽象概念
  • 是一种只能定义类型却不能产生对象的类型
  • 只能被继承并重写相关函数
  • 直接特征是相关函数没有完整的实现

上面说道的shpe是现实世界中的抽象的图形概念:
因此:

  • 程序中必须能反应抽象的图形概念
  • 程序中通过抽象类来表示图形的概念
  • 抽象类不能用于创建对象,只能用于继承

3、C++中是如何实现抽象类的:

  1. C++通过纯虚函数实现抽象类
  2. 纯虚函数指的是:只定义函数原型的成员函数
  3. 一个C++的类中存在纯虚函数,就构成了抽象类

    4、 纯虚函数的语法规则:
    这里写图片描述

抽象类初探:

#include <iostream>
#include <string>using namespace std;class Shape
{
public:virtual double area() = 0;
};class Rect : public Shape  //定义矩形
{int ma;int mb;
public:Rect(int a, int b)  {ma = a;mb = b;}double area(){return ma * mb;}
};class Circle : public Shape
{int mr;
public:Circle(int r){mr = r;}double area(){return 3.14 * mr * mr;}
};void area(Shape* p)
{double r = p->area();cout << "r = " << r << endl;
}int main()
{Rect rect(1, 2);Circle circle(10);area(&rect);area(&circle);return 0;
}

小结:

  • 抽象类只能用作父类被继承
  • 子类必须实现纯虚函数的具体功能
  • 纯虚函数被实现后,成为虚函数
  • 如果子类没有实现纯虚函数,那么子类成为抽象类

5、什么是接口?

满足下面条件的C++类成为接口:

  • 类中没有定义任何的成员变量
  • 所有的成员函数都是公有的
  • 所有的成员函数都是纯虚函数
  • 接口是一种特殊的抽象类

接口初探:

#include <iostream>
#include <string>using namespace std;class Channel
{
public:virtual bool open() = 0;virtual void close() = 0;virtual bool send(char* buf, int len) = 0;virtual int receive(char* buf, int len) = 0;
};int main()
{return 0;
}

6、总结:

  1. 抽象类用于描述现实世界中的抽象概念
  2. 抽象类只能被继承不能创建对象
  3. C++中没有抽象类的概念
  4. C++中通过纯虚函数实现抽象类
  5. 类中只有纯虚函数时称为接口
  6. 接口是一种特殊的抽象类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423161.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

有效沟通力思维导图

有效沟通&#xff0c;适用于生活和工作中&#xff0c;甚至是孩子教育上面&#xff0c;分享一下&#xff1b;

数据结构思维导图

学习是一个不断渐进的过程&#xff0c;最近整理了一下数据结构思维导图&#xff0c;分享一下&#xff0c;后续更新中 总结&#xff1a;算法实际上属于&#xff0c;数据建模&#xff0c;首先是问题的抽象&#xff0c;采用数学公式来表示&#xff08;数据建模&#xff1a;将问题…

(转)代理模式(Proxy)

原文地址&#xff1a;http://www.cnblogs.com/QinBaoBei/archive/2010/05/18/1737866.html 为了深刻点理解代理模式&#xff0c;我们先来看一个 Demo &#xff0c; 首先这个 Demo 是用来测试 QQ 号码是否在线&#xff0c; 这里涉及到的内容是 Web 服务的使用&#xff0c; 这个 …

【C++深度剖析教程31】被遗弃的多重继承

加qq1126137994 微信&#xff1a;liu1126137994 C中是否允许一个类继承多个父类&#xff1f; C支持编写多重继承的代码&#xff1a; 一个子类可以拥有多个父类子类拥有所有父类的成员变量子类继承父类所有的成员函数子类对象可以当做任意父类对象使用 多重继承的语法规则&a…

zookeeper思维导图

之前用word文档记笔记&#xff0c;但是没有思维导图清晰&#xff0c;又整理了一下&#xff0c;分享一下&#xff1b;

redis 思维导图

之前整理的redis 思维导图&#xff0c;分享一下&#xff0c;后续持续更新;

网站切图初学

先做一个简单的说明为什么选择Photoshop软件而没有选择Firework软件。Friework Dreamweaver Flash号称网页制作三剑客&#xff0c;Friework与Dreamwaver整合得更为紧密&#xff0c;在这里只所以选择photoshop只是因为我的偏好&#xff0c;况且我对 firework软件使用的次数很少&…

main函数的参数的含义

转载自&#xff1a;点击链接 链接2 加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 最近学习服务器网络编程&#xff0c;遇到了一个问题&#xff0c;main函数的参数&#xff0c;特意整理资料记录之&#xff01;&#…

【C++深度剖析教程35】函数模板的概念和意义

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、问题引入&#xff1a; C中有几种变量交换的方法&#xff1f; 定义宏代码块和定义函数 #include <iostream> #include <string>using namespace std;#d…

【C++深度剖析教程36】深入理解函数模板

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、函数模板深入理解 编译器从函数模板通过具体类型产生不同的函数编译器会对函数模板进行两次编译 *对模板进行编译 *对参数替换后的函数进行编译 注意事项&#xf…

【C++深度剖析教程37】类模板的概念和意义

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、类模板 一些类主要用于存储和组织数据元素类中数据的组织方式和数据元素的具体类型无关如 数组类&#xff0c;链表类&#xff0c;stack类&#xff0c;queue类等 C中…

【C++深度剖析教程38】类模板深度剖析

加qq1126137994 微信&#xff1a;liu1126137994 一起学习更多技术&#xff01;&#xff01;&#xff01; 1、多参数类模板 类模板可以定义任意多个不同的类型参数 类模板可以被特化&#xff1a; 指定类模板的特定实现部分类型参数必须显示指定根据类型参数分开实现类模板…

dbeaver 连接hbase 数据库

1.安装dbeaver 参考: https://blog.csdn.net/volitationLong/article/details/80583977 安装dbeaver 2.配置hosts 文件 10.21.21.89 nn01.as 10.21.21.94 nn02.as 10.21.21.93 dn01.as 3.配置用户变量 4. 配置hbase 驱动 连接参数 点击“新建连接”按钮 4.1 选择:a…

docker思维导图

之前学习的总结的思维导图&#xff0c;后续持续更新

ODI配置Mysql5.1数据库服务器

场景&#xff1a;服务器端mysql装了是Mysql5.1版本&#xff0c;最开始使用mysql-connector-java-5.0.6-bin.jar 驱动&#xff0c;经测试&#xff0c;无法连接成功&#xff0c;后来再网络上下载了最新的驱动mysql-connector-java-5.1.12-bin.jar 发现还是没法连接成功。最后面使…

【Linux进程、线程、任务调度】一 Linux进程生命周期 僵尸进程的含义 停止状态与作业控制 内存泄漏的真实含义 task_struct以及task_struct之间的关系

学习交流加&#xff08;可免费帮忙下载CSDN资源&#xff09;&#xff1a;个人微信&#xff1a; liu1126137994学习交流资源分享qq群1&#xff08;已满&#xff09;&#xff1a; 962535112学习交流资源分享qq群2&#xff1a; 780902027 文章目录1、进程控制块PCB2、进程的生命周…

Ubuntu 8.04下Netbeans的字体反锯齿解决(转)

原帖地址&#xff1a;http://www.oklinux.cn/html/Basic/jyjq/20081011/62034.html 测试可用&#xff0c;网上搜的其他方法如复制字体文件等都不成功。 首先说明&#xff0c;我是被锯齿的Netbeans折磨了半年才下决心解决来解决这个问题&#xff0c; 想想还真是冤枉。 我用的Li…

hive工作中分享总结

hive分享总结1. 数据家谱:1.1.Hive 是什么&#xff1f;1.2.数据仓库1.3.Hive与传统数据库的区别1.4.Hive的优缺点1.5.Hive使用场景1.6.Hdfs 运行机制1.7.Mapreduce 运行机制1.8.SQL转化成MapReduce过程1.9.Hive 架构:2.Hive交互方式2.1.Hive交互shell2.2.JDBC交互2.3.第三种交互…

IMX6移植Linux3.0.35内核时需要添加的矩阵按键的平台设备信息

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 本文记录在IMX6开发板上移植鼎芯Linux3.0.35内核时&#xff0c;需要配置的矩阵按键的信息。本设备使用的矩阵按键是一个5*5的矩阵按键。 本人其他开发…