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抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...
随机推荐
- 21 python的魔法方法(转)
魔法方法 含义 基本的魔法方法 __new__(cls[, ...]) 1. __new__ 是在一个对象实例化的时候所调用的第一个方法2. 它的第一个参数是这个类,其他的参数是用来直接传递给 _ ...
- flask 操作数据时,db的要在app.config设置之后声明:如app.config['SQLALCHEMY_DATABASE_URI']
flask 操作数据时,db的要在app.config设置之后声明:如app.config['SQLALCHEMY_DATABASE_URI'] 否则,运行程序时app.config里面做的设置就不会 ...
- 使用sp_addlinkedserver、sp_dropserver 、sp_addlinkedsrvlogin和sp_droplinkedsrvlogin 远程查询数据
一.sp_addlinkedserver 创建链接服务器. 链接服务器让用户可以对 OLE DB 数据源进行分布式异类查询. 在使用 sp_addlinkedserver 创建链接服务器后,可对该服 ...
- 网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+
网站app被劫持怎么办?HTTPDNS阿里云域名防劫持, DNSPod 移动解析服务 D+ HTTPDNS_移动开发_域名解析_域名防劫持-阿里云https://www.aliyun.com/prod ...
- GoldenGate抽取Informix数据库安装及配置
GoldenGate抽取Informix数据库安装及配置 本次测试架构 l 在中间机上安装informix csdk4.10版本,并编译配置unixODBC; l 在中间机上安装ogg for I ...
- 2015全国大学生数学建模B题浅谈
题目请自主上网获取. 分析下思路.第一问,不同时空的出租车的“供求匹配”程度. 也就是说要选取的数据要有时间和地理两个维度.实体对象是出租车.关键的问题就是地点怎么选? 选择的城市具备如下经济较发达, ...
- Python Gevent协程自动切换IO
Gevent Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程. Gr ...
- onsubmit 事件
onsubmit 事件 Event 对象 定义和用法 onsubmit 事件会在表单中的确认按钮被点击时发生. 语法 onsubmit="SomeJavaScriptCode" 参 ...
- vue 文件目录结构详解
vue 文件目录结构详解 本篇文章主要介绍了vue 文件目录结构详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 项目简介 基于 vue.js 的前端开发环境,用于前后 ...
- mvc 之 RouteConfig配置
//这里没有使用对用的指定参数 /Day_1:表示解决方案的名称,意思是默认找到该项目解决方案目录下的controllers进行匹配 routes.MapRoute( "Default&qu ...