C++的三大特性?C也可以做到
C++的三大特性是什么?封装、继承与多态,那么今天这篇文章小编就来介绍一下,如何用C语言实现C++的这三个特性。
1.封装
何为封装?
在面向对象的思想中,将数据和对数据的操作封装在一起——即类。
类只对外界开放接口(即有权访问的函数接口),而将接口的实现细节和该类的一些属性(变量)隐藏起来,达到数据的抽象性(使具有相同行为的不同数据可以抽象为同一个类)、隐藏性和封装性。
我们知道,C语言中有struct结构体类型,能够将多种数据类型封装在一起,然而如何将对数据的操作一起封装进来呢?——函数指针。
对,显然我们可以使用函数指针。如下就是名为pfun,指向一个返回值为空、形参列表为空的函数指针:
函数指针格式简介
那么问题已经得到解决:将类中的函数以函数指针的形式存放在C的结构体中,即可实现封装(此处未讨论访问权限问题,小编仍在思考较好的方法,大家如果有好的建议记得留言噢n(*≧▽≦*)n!)
如下图所示,结构体AchievePackage中有成员变量_a和两个函数指针,在InitStruct函数中被赋予两个函数的地址(函数名即为其地址,也可为&fun1,得到的值一样),故在此处InitStruct函数相当于该结构体的构造函数,既可以初始化其成员变量_a的值,也在对象定义的同时为其函数指针赋值(需显示调用)
C语言实现封装详解
2.继承
顾名思义,就像孩子会继承父母的一些性格或特点,两个类如果存在继承关系,其子类必定具有父类的相关属性(即变量)和方法(即函数)。
在C++中,如果想要类B去继承类A,需要在B定义时增加如下语句:
C++继承简介
那么C语言要如何实现此特性呢?讲到这里,大家可以想到什么?
【组合】:如果仅仅是想用一个已有类的一些方法去辅助新生成的类,组合是一个很好的方案,即在新类中直接定义已有类的对象,通过该对象的一些方法去辅助新类的操作。
它与继承相比:
继承即“属于(is a)”关系,而组合是“包含(has a)”关系。
继承是复用原类,并对其进行扩展,而包含仅仅是组合在一起。
如我们可以用普通车辆(所有车的共同特性)扩展(继承)出公交车、面包车、越野车等等,它们都属于普通车辆;也可以用发动机、排气筒、轮子等组合出一辆车,它们都包含在车辆中。
下面我们就用“组合”去实现一下C语言中的继承:
C语言实现继承代码
3.多态
在C++中,多态是通过父类的指针或引用,调用了一个在父类中是virtual类型的函数,实现动态绑定机制。我们知道,若想使用父类的指针/引用调用子类的函数,需要在父类中将其声明为虚函数(virtual),且必须与子类中的函数参数列表相同(包括参数个数、类型、顺序),返回值也相同(若不同为协变的情况,需要各自返回各自类的指针/引用)。
那么如何用C实现多态?
C++的多态是通过覆盖实现的,即父类的函数被子类覆盖了!
父类的该函数为虚函数,告诉父类的指针/引用,你调用这个函数的时候必须看一看你绑定的对象到底是哪个类的对象,然后去那个类里调用该函数!
So,覆盖!我们用值的覆盖,去改变函数指针,是否可以达到多态的效果呢?
C语言实现多态代码
以上,便是C语言实现C++三大特性的全部内容。
需要注意的是:
毕竟是用C语言去实现本不属于它的特性,一定会存在不可避免的付出,但我们可以通过不同的处理,尽量降低付出成本。
本文中未对访问限定符public、protected、private进行讨论
C++的三大特性?C也可以做到的更多相关文章
- Fis3的前端工程化之路[三大特性篇之声明依赖]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之资源定位]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- Fis3的前端工程化之路[三大特性篇之内容嵌入]
Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...
- JS三大特性
抽象 在分析三大特性之前我们要先了解什么叫抽象. 定义: 在定义一个类的时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板),这种研究问题的方法就称为抽象 一.封装 定义: ...
- Java 浅析三大特性之一继承
上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...
- 前端学PHP之面向对象系列第三篇——三大特性
× 目录 [1]封装 [2]继承[3]多态 前面的话 php面向对象编程的三大特性是封装性.继承性和多态性.本文将介绍php的这三大特性 封装 封装就是把对象中的成员属性和成员方法加上访问修饰符( p ...
- 第9章 Java类的三大特性之一:继承
1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...
- 黑马程序员_ Objective-c 概述及面向对象与三大特性
-----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...
- 谈谈Java面向对象的三大特性
Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...
- java提高篇之理解java的三大特性——多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
随机推荐
- IT行业的一些专业术语
SDK:SDK(Software Development Kit, 即软件开发工具包 )一般是一些被软件工程师用于为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件的开发工具的集合. 参考:h ...
- C++中map的用法
map的特性是,所有元素都会根据元素的减值自动被排序.map的所有元素都是pair,同时拥有实值(value)和键值(key).pair的第一个元素会被视为键值,第二个元素会被视为实值.map不允许两 ...
- 鼠标指向表格时 显示更多信息 toolTipController1
//窗体添加 控件 ,然后将GridControl 相关属性栏对应上新加的控件 切记 本文是转帖,稍作修改 private void toolTipController1_GetActiveObjec ...
- scala学习手记21 - 传递变长参数
在Java中是可以使用变长参数的,如下面的方法: public void check(String ... args){ for(String tmp : args){ System.out.prin ...
- android视图概述
android视图概述 一.简介 数据和控件分开的作用: 便于引用 便于修改:修改的时候直接改一次数据就可以了
- 20165332实验三 敏捷开发与XP实践
20165332实验三 敏捷开发与XP实践 实验内容 1:XP基础 2:XP核心实践 3:相关工具 实验1 在IDEA中使用工具(Code->Reformate Code)把下面代码重新格式化, ...
- 内存保护机制及绕过方案——通过覆盖虚函数表绕过/GS机制
1 GS内存保护机制 1.1 GS工作原理 栈中的守护天使--GS,亦称作Stack Canary / Cookie,从VS2003起开始启用(也就说,GS机制是由编译器决定的,跟操作系统 ...
- spring 多数据源动态切换
理解spring动态切换数据源,需要对spring具有一定的了解 工作中经常遇到读写分离,数据源切换的问题,那么以下是本作者实际工作中编写的代码 与大家分享一下! 1.定义注解 DataSource ...
- jsp的运行内幕--Tomcat容器对自定义标签的解析过程
http://blog.sina.com.cn/s/blog_4adc4b090101daqb.html
- delete和truncate区别
相同之处:truncate在功能上与不带WHERE子句的delete 语句相同:二者均删除表中的全部行.小心使用truncate,删除后就没有了 1.delete : 删除"表格记录&quo ...