C++面向对象的特点

面向对象的特点主要有: 封装, 继承, 多态; 现在自己的简单理解如下, 但要明白具体怎么实现, 背后的原理是什么?

什么是封装, C++怎么实现封装

  1. 封装的大致可以分为: 函数的封装和类的封装, 函数的封装相当于把各个功能模块写成一个函数, 从上到下依次调用;

    • 类的封装:就是把变量和函数接口封装为一个class, 这种类就相当于一种类型, 可以声明这种类型的变量, 叫作对象;
  2. 更官方的说法是: 封装将事物拥有的属性和动作隐藏起来, 只保留特定的方法和外界联系(即public函数接口);
  3. 封装就是抽象出类, 类含有属性和方法;
  4. 封装的好处就是代码功能分离;代码清晰易读;

什么是继承, C++怎么实现继承

  1. 继承就是子类可以拥有父类的属性和方法, public继承和private继承;
  2. 继承的优势是: 代码复用率高

什么是多态, C++怎么实现多态

  1. 多态: 简单理解就是一种接口, 可以具有多种不同的实现, 根据基类指针实际指向的类对象调用对应的方法;
  2. 多态实现的一个简单例子
    • 加减乘除各用一个函数实现(既没有类的封装, 也没有体现继承, 更别说多态), 只能勉强说体现了函数封装(功能的封装);
    • 封装就是将这四个功能函数封装成一个类, 包含两个操作变量和四个方法(其实有点为了封装而封装的成分);
    • 为了体现继承和多态: 声明一个基类为纯虚类, 加减乘除声明为派生类, 但具体实现不一样;
  3. 多态也是分很多种的: 重载多态,强制多态,包含多态,参数多态;
    • 普通函数和类的成员函数的重载属于重载多态,还有运算符重载;
    • 强制多态包括类型强制转换等;
    • 包含多态主要通过虚函数来实现;
    • 参数多态和类模板相关;
  4. C++中的多态只能通过指向基类类型的指针和引用来调用对象的虚函数来实现; 因为可以用派生类对象来初始化或者给基类类型的指针赋值;
    • 基类类型的指针所指向的对象有可能是基类型,也可能是派生类型,所以只有到运行时刻我们才知道指针所指向的对象到底是什么类型,所以当我们通过基类型的指针调用对象的虚函数时,只有判断该对象的类型后才知道调用的虚函数是哪一个类型的版本;
  5. 所谓多态,说到底,不外乎就是相同的函数名,不同的功能;
  6. 究C++编译器的实现,就会发现,所谓相同的函数其实在编译之后就变成不同的函数了,因为C++中的函数名被解析成类名+函数名+参数;
  7. 编译期多态以模板实现,运行期多态运用虚函数表实现;
  8. 了解虚函数表的位置, 虚函数表中各个虚函数指针的位置, 以及带有继承类的各个成员变量的位置;
    • 指针和引用,这两个是运行时多态的基石;
    • 创建一个基类指针,当它指向不同的对象时,调用的虚函数也不同,这就是多态;
  9. C++编译器实现多态的原理
    • 当类中声明虚函数时,编译器会在类中生成一个虚函数;
    • 虚函数表是一个存储类成员函数指针的数据结构;
    • 虚函数表是由编译器自动生成与维护的;
    • virtual成员函数会被编译器放入虚函数表中;
    • 存在虚函数时,每个对象中都有一个指向虚函数表的指针(vptr指针);

多态, 虚函数, 纯虚函数的关系

  1. 官方一点的多态解释: 是对于不同对象接收相同消息时产生不同的动作;

    • C++的多态性具体体现在运行和编译两个方面:在程序运行时的多态性通过继承和虚函数来体现;
    • 编译时多态通过模板函数, 模板类来实现, 编译时推导参数反演;
    • 编译时多态性还可以体现在函数和运算符的重载上;
  2. 虚函数:在基类中冠以关键字 virtual 的成员函数, 它提供了一种接口界面, 允许在派生类中对基类的虚函数重新定义;
    • 让每个类都可以覆盖这个方法的内容,非静态成员,具有继承性,不是重载声明而是覆盖,执行不同的函数,
      通过指针指向或者引用, 在C++中,虚函数的唯一用处就是构成多态;
    • 如果不是虚函数继承, 基类指针或引用指向派生类, 调用同一方法其实是调用基类的方法, 编译器认为派生类应该退变为基类在被调用, 有一种隐式类型转换的味道在里面;
  3. 纯虚函数的作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要对它进行定义; 作为接口而存在 纯虚函数不具备函数的功能,一般不能直接被调用; 具有纯虚函数的叫作抽象类(abstract);

C++面向对象的特点的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  10. .NET基础拾遗(2)面向对象的实现和异常的处理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. "Error 0162 - Setup data integrity check failure" after updating BIOS via Thinkvantage

    Start the computer and start pressing F1 and get into set up. In setup press F9 for default settings ...

  2. Kafka技术内幕 读书笔记之(二) 生产者——新生产者客户端

    消息系统通常由生产者(producer ). 消费者( consumer )和消息代理( broker ) 三大部分组成,生产者会将消息写入消息代理,消费者会从消息代理中读取消息 . 对于消息代理而言 ...

  3. Hadoop记录-hadoop和hbase监控有那些比较好的工具

    New Relic hadoop  jmx granfa falcon Ganglia,Nagios和Chukwa 自带监控软件 hadoop yarn 开启jmx监控 打开{hadoop_home} ...

  4. Github/github 初始化教程

    注: 由于将项目迁移到gitee,克隆gitee 的时候出现了问题.不得已,重新配置 ref : https://blog.csdn.net/jingtingfengguo/article/detai ...

  5. 905. Sort Array By Parity

    Description Given an array A of non-negative integers, return an array consisting of all the even el ...

  6. UML图的使用

    UML(Unified Modeling Language)中文统一建模语言,是一种开放的方法,用于说明.可视化.构建和编写一个正在开发的.面向对象的.软件密集系统的制品的开放方法. 类之间的关系 在 ...

  7. Java通过cal.get(Calendar.MONTH)比真实月份少一个月

    Calendar cal = Calendar.getInstance();假如当前是12月,cal.get(cal.MONTH)是11月.

  8. faster rcnn 做识别

    faster rcnn 主要分为四个部分: 1. convolutional part: 特征提取 可以使用vgg,resnet 等等 2.region proposal network: 生成 re ...

  9. NEX 事件

    我正在上班突然看到这个事情差点没笑抽. 转自纯洁的微笑:原文在此:http://www.cnblogs.com/ityouknow/p/9247842.html#4010697 大家知道 VIVO 上 ...

  10. redis集群学习

    转载: http://arganzheng.life/redis-cluster.html Redis3.0版本加入了cluster功能,解决了Redis单点无法横向扩展的问题. 分布式系统要解决的不 ...