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抽象类与接口的区别
很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题.本文我们将仔细讨论这些话题. 在讨论它们之间的不同点之前,我们先看看抽象类.接口各自的特性. ...
随机推荐
- 查询oracle数据字典,并对应出hive的数据类型
SQL开始 select t2.owner||'.'||t2.TABLE_NAME 源表名, 'dl_{0}_seq.'||'tt_{1}_'||lower(t2.table_name) hive表名 ...
- oracle常用函数介绍
Oracle函数 Oracle SQL提供了用于执行特定操作的专用函数,这些函数大大增强了SQL语言的功能.函数可以接受零个或者多个输入参数,并返回一个输出结果.Oracle数据库中主要使用两种类型的 ...
- 51Nod 博弈模板题
连刷3道博弈模板题,算是稍微学习了以下三个经典博弈了.推荐一个博客. 第一道模板:Bash博弈——同余理论 1066 Bash游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度 ...
- 2019/3/28 wen 继承
- Centosphp安装cassandra扩展
一.准备 当前php版本PHP Version 5.5.10,首先去http://pecl.php.net/package/cassandra,找到对应的php版本 二.下载安装 # wget htt ...
- 单元测试系列之三:JUnit单元测试规范
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6762032.html Junit测试代 ...
- No executable found matching command "dotnet-aspnet-codegenerator"
vs2017,mvc新建控制器报错. 右键项目,选择编辑工程文件(.csproj),加入以下节点 <ItemGroup> <DotNetCliToolReference Includ ...
- NYOJ 542 试制品(第五届河南省省赛)
解法不唯一,但是还是set好理解而且用着爽,代码注释应该够详细了 #include<stdio.h> #include<string.h> #include<math.h ...
- Android 开发版本统一
一.概述 对于 Android 开发版本的统一涉及到的东西就是 Gradle 中的全局设置,我们通过配置 gradle 也就是编写 Groovy 代码将开发中的版本号设置为全局参数.这样就能够在 mo ...
- Cordova结合Vue学习Camera
简单聊两句 学习Vue+Cordova打包编译App,首先你要安装Cordova与vue,在这里本人就不说明了,自行看文档与搜索相关资料. Cordova中文官网地址 Vue中文官网地址 第一步:首先 ...