C++ 抽象类与接口
1. 抽象类
在面向对象编程中,抽象类是一种只能定义类型,不能生成对象的类,它是对一系列看上去不同,但是本质相同的具体概念的抽象。最典型的的抽象类就是”图形”,三角形、矩形、梯形都是图形,它们都具有边长、面积属性,”图形”类是对这系列的抽象。
程序设计中,我们可以定义一个表征图形的类,然后具体图形继承该类。图形类,即基类定义如下:
class Shape
{
public:
double area() //求面积
{
//如何求??
}
};
实际上,只要是具体图形就有面积这个量,但是对”图形”求面积是没有任何意义的,只有在知道具体的图形类型之后才能求面积。所以对”图形”来说,area()函数无法实现,且不可让Shape生成对象(生成对象无意义),这就需要把Shape定义成一个抽象类:把area()函数声明为纯虚函数即可:
virtual double area() = 0;
总结什么是抽象类:其实,在c++中并没有抽象类的概念,要实现抽象类则需要通过纯虚函数实现。纯虚函数指的是只定义函数原型的成员函数。在c++的类中,只要存在纯虚函数,那么该类就变成抽象类。
(1) 每个具体图形的求面积算法不一样,所以加上virtual关键字,表明该函数是虚函数,在子类中重写时可以发生多态;
(2) 为对Shape类求面积无意义,所以加上”= 0”表明该函数声明为纯虚函数,不需要定义函数体。
(3) 抽象类不能生成对象,只能用作父类被继承,子类必须实现纯虚函数的具体功能,在子类中,父类的纯虚函数被实现后就变成虚函数,当然,如果子类没有实现父类的纯虚函数,那么子类也是抽象类一个。
class shape
{
public:
//纯虚函数
virtual double area() = 0;
};
//定义圆形类
class circle : public shape
{
private:
int r;
public:
circle(int a) : r(a)
{}
double area()
{
return r * r * 3.14;
}
};
//定义矩形类
class rectangle : public shape
{
private:
int x;
int y;
public:
rectangle(int a, int b) : x(a), y(b)
{}
double area()
{
return x * y;
}
};
int main(void)
{
rectangle r(5, 6);
circle c(5);
printf("圆形面积为: %.2lf\n", c.area());
printf("矩形面积为: %.2lf\n", r.area());
return 0;
}
编译运行:
2. 接口
理解了什么是抽象类后(类中含有纯虚函数),理解什么是接口就简单了。c++中接口也是一种特殊的类,需要满足:
(1) 类中没有定义任何成员变量
(2) 类中所有成员函数都是公有且都是纯虚函数
举例:
class deviceOp
{
public:
virtual bool OpenDev() = 0;
virtual void CloseDev() = 0;
virtual bool WriteDev(const char* buf, int len) = 0;
virtual int ReadDev(char* buf, int len) = 0;
};
接口是一种特殊的抽象类,所以抽象类具有只能被继承不能创建对象的特征它也具备。
原文摘自:https://blog.csdn.net/qq_29344757/article/details/77346934
C++ 抽象类与接口的更多相关文章
- 抽象类 VS 接口
引言 接口和抽象类是面向对象编程(OOP, Object Oriented programming)中两个绕不开的概念,二者相似而又有所不同.接下来,我们来了解二者的概念并比较它们的异同. 什么是抽象 ...
- java抽象类和接口
面向对象设计过程中重要的一点是如何进行抽象,即把"问题空间"中的元素与"方案空间"中的元素建立理想的一对一的映射关系.抽象类和接口便是抽象过程中的产物. ...
- php中抽象类与接口的概念以及区别
php里面的接口类,抽象类到底有什么用呢? 刚接触php的时候,觉得这个东西没什么用,其实这些东西还是有一定的作用的,下面我就简单的说说. 1.php 接口类:interface 其实他们的作用很简单 ...
- Java 抽象类与接口
接口和内部类为我们提供了一种将接口与实现分离的更加结构化的方法. 抽象类与接口是 Java 语言中对抽象概念进行定义的两种机制,正是由于他们的存在才赋予 Java 强大的面向对象的能力.他们两者之间对 ...
- 浅谈我对C#中抽象类与接口的理解
C#中的抽象类与接口有些相似,初学者很容易混淆,今天就让我来谈谈对二者的理解. 首先我们得明确二者的含义,分述如下: 如果一个类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅是作为其派生类的一个 ...
- Atitit 深入理解抽象类与接口 attilax总结
Atitit 深入理解抽象类与接口 attilax总结 1.1. 主要区别接口侧重于动作抽象..抽象类是属性名词抽象..1 1.2. 抽象层次类>>抽象类>>接口1 1.3. ...
- luogg_java学习_07_抽象类_接口_多态学习总结
这篇博客总结了半天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 抽象 一种专门用来做父类,被继承的. (模板) 格式: abs ...
- PHP中抽象类,接口定义
这里先介绍接口,因为在我最近看的好几本php工具书中都没有提到抽象类. 本人也觉得,在理解了接口后抽象类也非常好理解. 例子代码随便写了一下.例子代码是很ok的,测试过了不会报错,懒得看代码的筒靴们看 ...
- 0026 Java学习笔记-面向对象-抽象类、接口
抽象方法与抽象类 抽象方法用abstract修饰,没有方法体部分,连花括号都不能有: 抽象方法和抽象类都用abstract修饰 包含抽象方法的类一定是抽象类:但不包含抽象方法的类也可以是抽象类 不能创 ...
- Java抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...
随机推荐
- 使用Navicat定时备份mysql数据库和创建报表并邮件自动发送
数据库备份在现代计算机高速发展的今日变得日益重要,程序员往往因为不重视而忽略备份数据,导致数据丢失,造成非常严重的后果.定时备份无疑是解决备份的最好的途径,本文主要使用Navicat来自动备份数据库和 ...
- docker中i的作用
#docker container createKeep STDIN open even if not attached #docker container startAttach container ...
- app 开发
移动APP开发 ios Android 中国人写的 MUI 布局框架 HTML5plus 硬件驱动调用(打开摄像头,闪光灯,震动) 和 系统调用(打开相册,通讯录,message) http:/ ...
- nginx-fastcgi 第九章
CGI全称通用网关接口 Commmon Gateway Interface 用于HTTP服务上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上. 传统CGI接口方式性能较差,由于每次HTT ...
- iOS开发 -------- 网络状态监测
一 示例代码 需要先把第三方Reachability下载导入到工程中 下载网址 https://github.com/tonymillion/Reachability 1 封装网络工具类 Netw ...
- Win32汇编学习(10):对话框(1)
现在我们开始学习一些有关GUI编程的有趣的部分:以对话框为主要界面的应用程序. 理论: 如果您仔细关注过前一个程序就会发现:您无法按TAB键从一个子窗口控件跳到另一个子窗口控件,要想转移的话只有 用鼠 ...
- Python实现机器学习算法:决策树算法
''' 数据集:Mnist 训练集数量:60000 测试集数量:10000 ------------------------------ 运行结果:ID3(未剪枝) 正确率:85.9% 运行时长:35 ...
- url接收传参
下面是接收传参的代码: 方法一: function getQueryString(name) { var reg = new RegExp("(^|&)" + name + ...
- galera+mycat高可用集群部署
环境描述 10.30.162.29 client 环境描述 10.30.162.29 client 10.30.162.72 mysql1 10.30.162.73 mysql2 10.30.162 ...
- MapReduce 踩坑 - hadoop No FileSystem for scheme: file/hdfs
一.场景 hadoop-3.0.2 + hbase-2.0.0 一个mapreduce任务,在IDEA下本地提交到hadoop集群可以正常运行. 现在需要将IDEA本地项目通过maven打成jar包, ...