C++中非常重要的概念,尤其是相对于C语言而言,也是其具有如此高的工程使用性的重要原因。

封装

所谓封装是将某些东西隐藏起来,让外界无法直接使用,而必须通过某些特定的方式才能访问。也即是,将抽象得到的数据和行为(类似于属性和方法)结合构成一个有机整体,将数据与操作数据的函数构成类,其中数据和函数都是类的成员。

其目的是将对象的使用者和设计者隔离开来,提高软件的可维护性和可修改性,使用者不必了解具体的实现细节而只是通过外部接口及特定的访问权限使用类成员,从而增强了安全性且简化了编程,也使得不同类之间的相互影响降到最低。

一个类的成员有三种访问权限可以选择

  • public        所有人均可访问
  • private    只有当前类中成员函数可以访问
  • protected  只有当前类中和当前类的派生类中的成员函数可以访问

如果没有显示声明,class中的成员数据或成员函数默认访问权限是private,struct中默认访问权限是public

继承

指的是新类从已有的类中得到已有的特性。

继承使得子类具有父类的某些数据和函数,而不需要再次编写相同的代码,在继承的同时,子类也可以重新定义某些数据和函数并覆盖父类原有的数据和函数。

与类的成员访问权限相关,继承方式也分为三种:public,private,protected

一般分为单一继承和多重继承,常用的是单一继承,编程简单,可读性好。

需要注意的是class默认是private继承,而struct默认是public继承。

父类中的访问权限 继承方式 子类中的访问权限
public public public
private No access
protected protected
public private private
private No access
protected private
public protected protected
private No access
protected protected

子类会继承父类/基类除构造函数和析构函数以外的成员函数,一般析构函数定义为虚函数,否则的话析构时只会调用父类/基类中定义的析构函数而不会调用子类/派生类中的析构函数。

多态

父类成员函数前加virtual修饰就变成了虚函数。

纯虚函数就是父类只定义了虚函数而没有实现,则必须在子类中实现。如果子类中没有实现则子类仍为虚类,需要子类的子类去实现纯虚函数,即哪一层子类实现了纯虚函数,哪一层的子类才可以被初始化。纯虚函数相当于一个接口,子类必须实现这个接口才可以使用。

而多态性就是为了接口重用,无论传递过来的是哪个子类的对象,都能调用相应的子类函数。

多态是我们可以用相同的方式处理不同类型的对象,极大地提高了代码的可重复性。

多态性允许将子类类型的指针赋值给父类类型的指针,常通过虚函数来实现。虚函数就是允许子类重新定义的成员函数。

子类重写父类中的虚函数时,即使不用virtual声明,该函数也是虚函数,而父类中必须要有virtual声明。

一个接口,多种方法,多态主要有两种形式。

静态多态

在编译期将函数链接起来,此时即可确定调用哪个函数或模板,静态多态通过重载和模板实现。

在宏多态中,通过定义变量,编译时直接把变量替换,实现宏多态。

  • 优点
  1. 泛型编程,STL,非常便利
  2. 编译期完成,提高了运行效率
  3. 具有很强的适配性和松耦合性
  • 缺点
  1. 使得编程可读性降低,代码调试困难
  2. 无法实现木板的分离编译,工程量大时编译时间较长
  3. 无法处理异质对象集合

动态多态

在程序运行期间才能确定调用哪个函数或实现。父类指针或引用能够指向子类对象,调用子类的函数,所以在编译时无法确定调用哪个函数。

例如在父类中写一个虚函数,子类中进行重写,用一个指向父类的指针调用虚函数,实际上会调用在子类中重写的虚函数。

运行期多态的实现依赖于虚函数机制,当某个类声明了虚函数时,编译器将为该类对象安插一个虚函数表指针,并为该类设置一个唯一的虚函数表,表中存放该类虚函数的入口地址,运行期间通过虚函数表指针与虚函数表去确定该类虚函数的真正实现。

  • 优点
  1. 面向对象设计中非常重要的特性,对客观世界直觉的认识。
  2. 可以处理同一继承体系下的异质类集合
    vector<Animal*> anims;
    Animal *anim1 = new Dog;
    Animal *anim2 = new Cat; // 处理异质类集合实例
    anims.push_back(anim1);
    anims.push_back(anim2);
  • 缺点
  1. 运行期间进行虚函数绑定,增加了程序运行开销
  2. 庞大的类继承层次,对接口的修改容易影响类的继承层次
  3. 虚函数在运行期绑定,编译器无法对其进行优化

C++之封装继承和多态的更多相关文章

  1. day33 序列类型,绑定方法,类方法,静态方法,封装继承和多态

    Python之路,Day20 = 序列类型,绑定方法,类方法,静态方法,封装继承和多态 序列是指有序的队列,重点在"有序". 一.Python中序列的分类 Python中的序列主要 ...

  2. objective-c自学总结(三)---面向对象的封装,继承与多态

    面向对象的三大特性 封装 继承 多态 1.封装: 隐藏属性,方法或实现细节的过程称为封装 信息隐藏,隐藏对象的实现细节,不允许用户看到 将东西包装在一 然后以新的完整形式呈现出来 例如,两种或多种化学 ...

  3. python 面向对象及封装继承和多态

    ######装饰器######装饰器的概念 - 装饰器的实现是函数里面嵌套函数;- 装饰器的本质是一个函数, 它可以让其他函数在不需要做任何代码改动的前提下增加额外的功能;- 装饰器需要传递一个函数, ...

  4. Java的封装继承和多态

    封装 定义:属性私有private:get/set 目的 提高程序的安全性,保护数据 隐藏代码的实现细节 统一接口 提高系统的可维护性 代码 public class Student { //名字 p ...

  5. java封装继承以及多态(含代码)

    封装 该露的露,该藏的藏 我们常需设计要追求,"高内聚,低耦合".高内聚就是类的内部数据操作细节自己完成.不允许外部干涉:低耦合:仅暴漏少量的方法给外部使用. 封装(数据的隐藏) ...

  6. C++学习笔记 封装 继承 多态 重写 重载 重定义

    C++ 三大特性 封装,继承,多态 封装 定义:封装就是将抽象得到的数据和行为相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成类,其中数据和函数都是类的成员,目的在于将对 ...

  7. OC的封装、继承与多态

    面向对象有三大特征:封装.继承和多态. 一.封装 封装是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问.简而言之,信息隐藏,隐 ...

  8. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  9. java面向对象(封装-继承-多态)

    框架图 理解面向对象 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程强调的是功能行为 面向对象将功能封装进对象,强调具备了功能的对象. 面向对象是基于面向过程的. 面向对象的特点 ...

随机推荐

  1. Element UI 源码—— Carousel 走马灯学习

    参考博客:https://segmentfault.com/a/1190000014384638?utm_source=tag-newest

  2. forEach()和for/in循环的缺点与for-of循环

    以数组为例,JavaScript 提供多种遍历语法.最原始的写法就是for循环. for (var index = 0; index < myArray.length; index++) { c ...

  3. 拿到外包公司的offer,我要去么?

    引言: 前一阵子有一个帖子引起了非常广泛的讨论,描述的就是一个公司的外包工作人员,加班的时候因为吃了公司给员工准备的零食,被公司的HR当场批评!这个帖子一发出来,让现在测试行业日益新增的外包公司备受关 ...

  4. elementui入门

    1.前端服务器搭建 (1)创建一个static web project (2) 安装 npm install -g vue-cli (3) vue init webpack 项目名 (4)cd 项目名 ...

  5. Oracle常用函数(略微少了点 不过是自己稍微整理的)

    DECODE ​ DECODE(value ,if 1, then 1,if 2,then 2, ....,else) ​ 解析: ​ if 条件=1 ​ return (value 1) ​ if条 ...

  6. 在.Net Core中记录日志

    一个完善的系统,必然会有非常完善的日志记录,用户的操作.系统的运行状况等信息被完整的记录下来,方便我们对系统进行维护和改进..net core 也为日志记录提供了内置的支持. 在控制台程序中记录日志 ...

  7. conda docker镜像

    之前的python环境,使用ubuntu安装pip来安装python依赖,但是遇到缺少某些库的版本,比如一个项目需要用到faiss,pip只有最新的1.5.3版本,但是这个版本使用了较新的CPU指令, ...

  8. JPA中实现双向一对多的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  9. SpringCloud-使用熔断器仪表盘监控熔断

    场景 SpringCloud-使用熔断器防止服务雪崩-Ribbon和Feign方式(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  10. 商业分析BA:用户故事怎么拆?

    什么是User Story其实我觉得要对User Story做一个定义还是挺难的.曾经的我以为,所谓User Story是User来讲述的Story.你看啊,User Story的编写范式:As a ...