C++中的抽象类和接口
1,在 C++ 语言中,并不直接支持面向对象中的抽象类和接口概念,但是 C++ 语言 却可以间接实现这些概念;
2,什么是抽象类:
1,面向对象中的抽象(其实就是分类)概念:
1,在进行面向对象分析时,会发现一些抽象的概念,如图形的面积如何计算?
2,图形类:

1,图形的面积是不能计算的,肯定要问是什么图形的面积(这就是继承);
2,通过分类的方式将实际的图形分为一类,统称为图形(这就是将实际对象抽象,编程抽象类);
3,在现实中需要知道具体的图形类型才能求面积,所以对概念上的“图形求面积没有意义的;
class Shape // 有必要在程序中开发这样一个图形类出来,这样的抽 象概念应该作为父类存在;
{
public:
double area() // 返回当前图形的面积,之后的图形类要重写这个函数;
{
return ;
}
};
4,Shape 只是一个概念上的类型,没有具体对象;
1,必须要保证这一点;
2,架构师告诉所有开发者,Shape 类只能继承,不能创建对象,但是不能保证别人强制执行;
3,要反应现实世界中图形的概念;
3,Shape 类有必要存在吗?
1,有
4,面向对象中的抽象类(现实世界的重要概念,且面向对象理论也支持):
1,可用于表示现实世界中的抽象概念;
2,是一种只能定义类型,而不能产生对象的类;
3,只能被继承并重写相关函数;
1,抽象类作用就只是被继承;
2,设计中,如果一个类是父类,就要考虑它有没有必要成为一个抽象类,判断准则是这个父类有没有必要产生一个对象,没必要则做成抽象类;
4,直接特征是相关函数没有完整的实现;
1,抽象类的特点就是有些函数没有完整实现;
5,Shape 是现实世界中各种图形的抽象概念,因此:
1,程序中必须能够反映抽象的图形;
2,程序中通过抽象类表示图形的概念;
3,抽象类不能创建对象,只能用于继承;
6,抽象类与纯虚函数:
1,C++ 语言中没有抽象类的概念;
2,C++ 中通过纯虚函数实现抽象类;
3,纯虚函数是指只定义原型的成员函数;
1,只有声明就可以;
4,一个 C++ 类中存在纯虚函数就成为了抽象类;
7,纯虚函数的语法规则:
1,代码示例:
class Shape
{
public:
virtual double area() = ;
};
2,“=0” 用于告诉编译器当前是声明纯虚函数,因此不需要定义函数体;
1,如果定义了类对象,编译器直接报错;
8,抽象类初探编程实验:
#include <iostream>
#include <string> using namespace std; class Shape
{
public:
virtual double area() = ;
}; 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(); // 可以用抽象类指针调用子类虚函数;抽象类中的 area() 没有实现,但是子类的 area() 实现了;综上 p 指针指向的只可能是 Shape 这个抽象类的子类,而这个子类肯定必须要实现这个纯虚函数,实现这个纯虚函数后就有函数体就能够调用了,并且纯虚函数也是虚函数,所以说这里可以展现多态; cout << "r = " << r << endl;
} int main()
{
Rect rect(, );
Circle circle(); area(&rect);
area(&circle); return ;
}
9,抽象类与纯虚函数用法:
1,抽象类只能用作父类被继承;
2,子类必须实现纯虚函数的具体功能;
1,必须实现所有的纯虚函数,否知子类依旧是抽象类;
3,纯虚函数被实现后称为虚函数;
4,如果子类没有实现纯虚函数,则子类成为抽象类;
10,满足下面条件的 C++ 类则称为接口:
1,类中没有定义任何的成员变量;
2,所有的成员函数都是共有的;
3,所有的成员函数都是纯虚函数;
4,接口是一种特殊的抽象类;
1,C++ 中没有真正的接口概念,只能通过特殊的抽象类来模拟接口行为;
2,面向对象理论里面,接口是比较抽象的概念,其是一组行为的规范;
3,用程序设计语言说接口比较容易理解,在程序设计语言里面,接口就可以认为是一组函数原型,我们依次作为依据,通过满足上述三个条件的抽象类来得到接口;
4,C++ 中没有真正的接口,但是其后续语言比如 C#、Java 就可以看到接口的概念,后续这两个语言直接支持接口的概念;
11,接口初探编程实验:
#include <iostream>
#include <string> using namespace std; /* 抽象类实现下列四种方式的操作 */
class Channel // 抽象的概念,对应抽象概念;
{
public:
virtual bool open() = ; // 定义一个操作,对应到面向对象中就是一个成员函数;打开;
virtual void close() = ; // 关闭
virtual bool send(char* buf, int len) = ; // 收
virtual int receive(char* buf, int len) = ; // 发
};
1,满足接口的条件,所以是接口;
2,还是抽象类;
3,接口概念在 C++ 中项目和 Qt 课程中应用;
4,接口在面向对象分析与设计、面向对象编程中有重要应用;
1,网络编程:
1,从网络上收数据,处理完了后又从网络上发出去,就是收发的工作;
2,串口编程(这里要重点掌握):
1,将数据从串口发出去,然后再从串口收上来;
3,蓝牙、USB 编程:
1,将数据通过蓝牙、USB 收上来,处理完后,然后再发出去;
5,总结:
1,都是收发,只不过介质不同;
2,介质分别是:以太网、计算机串口、近距离无线编程、USB 口。
6,接口:
1,打开、收、发、关闭。
11,小结:
1,抽象类用于描述现实世界中的抽象概念;
2,抽象类只能被继承不能创建对象;
3,C++ 中没有抽象类的概念;
4,C++ 中通过纯虚函数实现抽象类;
5,类中只存在纯虚函数时成为接口;
6,接口是一种特殊的抽象类;
C++中的抽象类和接口的更多相关文章
- Java 中,抽象类与接口之间有什么不同?
Java 中,抽象类和接口有很多不同之处,但是最重要的一个是 Java 中限制一个 类只能继承一个类,但是可以实现多个接口.抽象类可以很好的定义一个家族类 的默认行为,而接口能更好的定义类型,有助于后 ...
- java中的抽象类和接口
抽象类和接口本身让面向对象真正实现,一个好的系统可以让抽象类或者接口实现多次复用,如果出现了集成具体类那么肯定是有问题的. 抽象类和接口很相似,很多时候好像功能可以混用,java设计者赋予了很多不一样 ...
- 第52课 C++中的抽象类和接口
1. 什么是抽象类 (1)面向对象中的抽象概念 思考:抽象图形中,图形的面积如何计算? (2)现实中:需要知道具体的图形类型,才能求面积. (3)Shape只是一个概念上的类型,没有具体对象 2. 面 ...
- PHP中的抽象类和接口
PHP抽象类和抽象方法的应用 抽象类 接口 多态 抽象类是以特殊的类,接口是一种特殊的抽象类声明抽象类和接口,以及一些需要的技术抽象类: 什么是抽象方法? 定义:如果一个类中的方法 ...
- JAVA中的抽象类与接口
抽象类 abstract class 包含抽象方法的类,叫抽象类.而抽象的概念就是抽象出共同属性:成员变量和方法.所以抽象类可以有private等多种权限的成员变量和非abstract的成员方法.当然 ...
- 论Java中的抽象类与接口
目录 抽象类和抽象方法 定义 与普通类的区别以及注意点: 抽象类的作用 接口 定义 示例 注意 作用 最后:接口与抽象类的异同 使用场景 借鉴 抽象类和抽象方法 定义 抽象方法和抽象类都必须被abst ...
- Java 8 中的抽象类和接口到底有啥区别?
上一篇栈长发了这篇<Java 8 有多牛逼?打破一切你对接口的认知!>,帮助许多人解开了疑惑,还有读者留言说两者还有啥区别,故引发了此篇: 在我们面试时也会经常遇到面试官问抽象类和接口的区 ...
- Java 中的抽象类及接口
抽象类使用 abstract 关键字修饰,该类即为抽象类. 抽象类的作用: 1.某些情况下,父类约束子类必须包含哪些方法,但不知道子类如何去实现这些方法. 2.可以从多个具有相同特征的类中抽象出一个抽 ...
- PHP中的抽象类与接口
抽象类 php5支持抽象类和抽象方法.类前加 abstract, 此类就成为抽象类,无法被实例化,此类天生就是用来被继承的,给子类提供了一个类的模板; 类方法前加 abstract,是抽象方法,抽象方 ...
随机推荐
- 前端 ----- 初探ES6 Promise
前段时间做项目,在调用接口的时候,遇到了异步问题.开始是使用定时器,发现效果并不理想,于是又用了回调,效果还好但是,很明显的影响了代码的整洁性. 于是我想起了在面试的那段时间,背过的面试题里,出现过一 ...
- Django 使用简单笔记
1. Django项目的启动: 1. 命令行启动 在项目的根目录下(也就是有manage.py的那个目录),运行: python3 manage.py runserver IP:端口--> 在指 ...
- 二、Spring Boot系列:Spring Initializer快速创建Spring Boot项目
1.点击创建新工程 2.选择Spring Initializer和jdk1.8 注意:项目名称要小写字母 3.现在只需要一个创建一个web,选择一个就好 4.没有用的文件,可以删除 5.pom.xml ...
- Python3.5-20190529-os模块
os.getcwd() 获取当前路径os.listdir("路径") 返回该路径下面所有的文件os.path.abspath(path):返回path的绝对路径.os.path.s ...
- springBoot 连接数据库
心得:1.先添加依赖. 2.在application.yml文件中创建mybatis的连接,与项目连接起来. 3.application.yml文件中可以自行配置服务器的端口,配置mybatis的路径 ...
- hdu 5868:Different Circle Permutation 【Polya计数】
似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...
- 【NLP新闻-2013.06.03】New Book Where Humans Meet Machines
英语原文地址:http://nlp.hivefire.com/articles/share/39865/ 注:本人翻译NLP新闻只为学习专业英语和扩展视野,如果翻译的不好,请谅解! (我挺想看这本书的 ...
- js this 指向
JavaScript 作为一种脚本语言身份的存在,因此被很多人认为是简单易学的.然而情况恰恰相反,JavaScript 支持函数式编程.闭包.基于原型的继承等高级功能.由于其运行期绑定的特性,Java ...
- spark streaming简单示例
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 生成100个 "20180520" 这样的时间字符串 写入txt文件
主要想记录一下 . 写NSString 到txt . 数组的去重 . 数组的截取 . 数组分割 代码如下: NSString *year = @"2018"; NSArray *m ...