C++的三大特性是什么?封装、继承与多态,那么今天这篇文章小编就来介绍一下,如何用C语言实现C++的这三个特性。

1.封装

何为封装?

在面向对象的思想中,将数据和对数据的操作封装在一起——即类。

类只对外界开放接口(即有权访问的函数接口),而将接口的实现细节和该类的一些属性(变量)隐藏起来,达到数据的抽象性(使具有相同行为的不同数据可以抽象为同一个类)、隐藏性和封装性。

我们知道,C语言中有struct结构体类型,能够将多种数据类型封装在一起,然而如何将对数据的操作一起封装进来呢?——函数指针。

对,显然我们可以使用函数指针。如下就是名为pfun,指向一个返回值为空、形参列表为空的函数指针:

函数指针格式简介

那么问题已经得到解决:将类中的函数以函数指针的形式存放在C的结构体中,即可实现封装(此处未讨论访问权限问题,小编仍在思考较好的方法,大家如果有好的建议记得留言噢n(*≧▽≦*)n!)

如下图所示,结构体AchievePackage中有成员变量_a和两个函数指针,在InitStruct函数中被赋予两个函数的地址(函数名即为其地址,也可为&fun1,得到的值一样),故在此处InitStruct函数相当于该结构体的构造函数,既可以初始化其成员变量_a的值,也在对象定义的同时为其函数指针赋值(需显示调用)

C语言实现封装详解

2.继承

顾名思义,就像孩子会继承父母的一些性格或特点,两个类如果存在继承关系,其子类必定具有父类的相关属性(即变量)和方法(即函数)。

在C++中,如果想要类B去继承类A,需要在B定义时增加如下语句:

C++继承简介

那么C语言要如何实现此特性呢?讲到这里,大家可以想到什么?

【组合】:如果仅仅是想用一个已有类的一些方法去辅助新生成的类,组合是一个很好的方案,即在新类中直接定义已有类的对象,通过该对象的一些方法去辅助新类的操作。

它与继承相比:

  1. 继承即“属于(is a)”关系,而组合是“包含(has a)”关系。

  2. 继承是复用原类,并对其进行扩展,而包含仅仅是组合在一起。

  3. 如我们可以用普通车辆(所有车的共同特性)扩展(继承)出公交车、面包车、越野车等等,它们都属于普通车辆;也可以用发动机、排气筒、轮子等组合出一辆车,它们都包含在车辆中。

下面我们就用“组合”去实现一下C语言中的继承:

C语言实现继承代码

3.多态

在C++中,多态是通过父类的指针或引用,调用了一个在父类中是virtual类型的函数,实现动态绑定机制。我们知道,若想使用父类的指针/引用调用子类的函数,需要在父类中将其声明为虚函数(virtual),且必须与子类中的函数参数列表相同(包括参数个数、类型、顺序),返回值也相同(若不同为协变的情况,需要各自返回各自类的指针/引用)。

那么如何用C实现多态?

  1. C++的多态是通过覆盖实现的,即父类的函数被子类覆盖了!

  2. 父类的该函数为虚函数,告诉父类的指针/引用,你调用这个函数的时候必须看一看你绑定的对象到底是哪个类的对象,然后去那个类里调用该函数!

So,覆盖!我们用值的覆盖,去改变函数指针,是否可以达到多态的效果呢?

C语言实现多态代码

以上,便是C语言实现C++三大特性的全部内容。

需要注意的是:

  1. 毕竟是用C语言去实现本不属于它的特性,一定会存在不可避免的付出,但我们可以通过不同的处理,尽量降低付出成本。

  2. 本文中未对访问限定符public、protected、private进行讨论

C++的三大特性?C也可以做到的更多相关文章

  1. Fis3的前端工程化之路[三大特性篇之声明依赖]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  2. Fis3的前端工程化之路[三大特性篇之资源定位]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  3. Fis3的前端工程化之路[三大特性篇之内容嵌入]

    Fis3版本:v3.4.22 Fis3的三大特性 资源定位:获取任何开发中所使用资源的线上路径 内容嵌入:把一个文件的内容(文本)或者base64编码(图片)嵌入到另一个文件中 依赖声明:在一个文本文 ...

  4. JS三大特性

    抽象 在分析三大特性之前我们要先了解什么叫抽象. 定义: 在定义一个类的时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板),这种研究问题的方法就称为抽象 一.封装 定义: ...

  5. Java 浅析三大特性之一继承

    上文Java 浅析三大特性之一封装我们说到Java是一个注重编写类,注重于代码和功能复用的语言.Java实现代码复用的方式有很多,这里介绍一个重要的复用方式--继承. 在介绍继承之前,我们要明确一点, ...

  6. 前端学PHP之面向对象系列第三篇——三大特性

    × 目录 [1]封装 [2]继承[3]多态 前面的话 php面向对象编程的三大特性是封装性.继承性和多态性.本文将介绍php的这三大特性 封装 封装就是把对象中的成员属性和成员方法加上访问修饰符( p ...

  7. 第9章 Java类的三大特性之一:继承

    1.什么是继承 子类继承父类就是对父类的扩展,继承时会自动拥有父类所拥有的处private之外的所有成员作用:增加代码复用语法格式: class 子类名 extends 父类名{…………}第9章 Ja ...

  8. 黑马程序员_ Objective-c 概述及面向对象与三大特性

    -----------android培训.java培训.java学习型技术博客.期待与您交流!------------ (一).语法概述 1. oc介绍:(.m文件) 1> c语言的基础上,增加 ...

  9. 谈谈Java面向对象的三大特性

    Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...

  10. java提高篇之理解java的三大特性——多态

    面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...

随机推荐

  1. 分享会上演示Dubbo的路由规则,结果被小坑了下

      今天公司给大家演示基于Dubbox的服务治理平台,结果因为开了vpn导致本机IP地址比较混乱,在配置路由规则的时候我这样配置条件路由 consumer.host=*.*.*.* => pro ...

  2. XMLHTTP.readyState

    XMLHTTP.readyState的五种就绪状态: 0:请求未初始化(还没有调用 open()). 1:请求已经建立,但是还没有发送(还没有调用 send()). 2:请求已发送,正在处理中(通常现 ...

  3. tomcat_下载

    1. http://tomcat.apache.org/ 2. 3.

  4. Springer Latex

    What are the guidelines for uploading a LaTeX formatted manuscript?   1. Always upload the main LaTe ...

  5. Eclipse和MyEclipse的区别

    翻译:日食,月食. eclipse是免费的,myeclipse是收费的. myeclipse是eclipse的插件.

  6. IFE 2015_spring task0002 自学记录

    JavaScript数据类型及语言基础 1. 判断arr是不是一个数组,返回一个bool值. 首先javascript有5大基本数据类型:Undefined,Null,Boolean,Number和S ...

  7. Python 数据分析练习1

    环境 Anaconda3 Python 3.6, Window 64bit 目的 从MySQL数据库读取数据,进行数据清理,数据展示 代码 # -*- coding: utf-8 -*- import ...

  8. js:s上次预览,上传图片预览,图片上传预览

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. javascript简单介绍总结(二)

    JavaScript 函数函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块.JavaScript 函数语法函数就是包裹在花括号中的代码块,前面使用了关键词 function:function ...

  10. idea解决@Data注解报红问题

    lombok是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,简单来说,比如我们新建了一个类,然后在其中写了几个字段,然后通常情况下我们需要手动去建立ge ...