三大特性:封装、继承、多态(静态有函数重载、动态有虚函数(覆盖))。

  1. 封装:通过类和对象实现,控制访问机制体现在有私有、保护、公用。实现代码模块化

    当private,public,protected单纯的作为一个类中的成员权限设置时:水平访问 => 延伸到类与类的关系(依赖、关联、聚合、组合、实现、继承 6种关系)可参考c++类之间的基本关系_baidu_16370559的博客-CSDN博客
    private: 只能由该类中的函数、其友元函数访问,不能被任何其他访问,该类的对象也不能访问. 
    protected: 可以被该类中的函数、子类的函数、以及其友元函数访问,但不能被该类的对象访问 
    public: 可以被该类中的函数、子类的函数、其友元函数访问,也可以由该类的对象访问

  2. 继承:实现代码扩展

    当private,public,protected作为继承方式时:垂直访问 参考:c++继承方式_baidu_16370559的博客-CSDN博客     对于公有继承方式: (1)父类的public成员成为子类的public成员,允许类以外的代码访问这些成员;(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;(3)父类的protected成员成为子类的protected成员,只允许子类成员访问;      对于私有继承方式: (1)父类的public成员成为子类的private成员,只允许子类成员访问;   (2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;(3)父类的protected成员成为子类的private成员,只允许子类成员访问; 对于保护继承方式: (1)父类的public成员成为子类的protected成员,只允许子类成员访问;(2)父类的private成员仍旧是父类的private成员,子类成员不可以访问这些成员;(3)父类的public成员成为子类的protected成员,只允许子类成员访问;

  3. 多态:引申到虚函数,重写(或覆盖)。多态性表现在:1.静态编译多态(即重载)。2运行多态(以虚函数方式),具体表现在通过基类的指针调用子类对象的方法。
  4. 覆盖(即是重写):派生类和基类,函数名相同,参数相同。当基类中的某个方法是virtual函数时,其子类中对该方法的重新实现就属于重写。使用时,可以通过基类的指针或者引用所指向的具体对象来确定调用的是哪个方法,从而实现函数的多态。对于基类中的非virtual类型的成员函数,若其子类中也声明了与该函数名称相同的函数,那么基类中的该函数(果该函数在基类中有重载的话)将被隐藏,可以通过域解析操作符来调用(即在方法名前加上基类名和两个冒号,子类对象.父类类名::重定义方法)。不过按照C++的设计思想来说呢,基类中的非virtual类型的成员函数,是不需要在子类中进行修改的,所以如果在子类中出现了这种隐藏的情况,说明应该将基类中的该函数改成virtual类型的,然后就是重写了
  5. 覆盖(即是重写)的前提条件:父类函数为虚函数(virtual);即同时满足3个条件:同名,同参,有virtual.
  6. A a;基类    B b; 子类 ,class B : public A 。多态的既可以通用基类的指针调用子类对象的方法( A *p = &b;)向上转换正常的,目的就是继承。
  7. 也可以通过子类的指针调用基类对象的方法( B *p = (B*)&a;)C++继承中的downcasting(向下转化)机制。
  8. 编译器为每一个类维护一个虚函数表,每个对象的首地址保存着该虚函数表的指针,同一个类的不同对象实际上指向同一张虚函数表
  9. 隐藏*(即是重定义):隐藏是指派生类的函数屏蔽了与其同名的基类函数。注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。
  10. 隐藏*(即是重定义:在子类中,函数名相同,但是参数不同,不构成重写的,体现在没有virtual.
  11. 如果派生类的函数与基类的函数同名,但是参数不同。此时,不论有无virtual关键字,基类的函数将被隐藏。
  12. 如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字。此时,基类的函数被隐藏。
  13. 纯虚函数是在基类只声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加“=0” virtual void funtion()=0 。包含纯虚函数的类称为抽象类,不能定义抽象类的对象,派生类都要定义自所有虚函数的实现方法,不然派生类也是抽象类。  我们也可以调用基类的纯虚函数,但只有一个方法:那必须是明确指出其类名称,即域解析操作符。纯虚函数也可以拥有自己的实现(即具体定义函数)。虽然在基类声明了纯虚函数,但也可以在基类实现其定义,该定义为缺省定义。子类还是要自己重写虚函数,如果子类也想调用缺省定义,就显性调用基类::虚函数。
  14. 一个成员函数被定义为private属性,标志着其只能被当前类的其他成员函数(或友元函数)所访问。而virtual修饰符则强调父类的成员函数可以在子类中被重写,因为重写之时并没有与父类发生任何的调用关系,故而重写是被允许的。

    编译器不检查虚函数的各类属性。被virtual修饰的成员函数,不论他们是private、protect或是public的,都会被统一的放置到虚函数表中。对父类进行派生时,子类会继承到拥有相同偏移地址的虚函数表(相同偏移地址指,各虚函数相对于VPTR指针的偏移),则子类就会被允许对这些虚函数进行重载。且重载时可以给重载函数定义新的属性,例如public,其只标志着该重载函数在该子类中的访问属性为public,和父类的private属性没有任何关系!

  15. 一:虚函数表指针(vptr)创建时机 vptr跟着对象走,所以对象什么时候创建出来,vptr就什么时候创建出来,也就是运行的时候。 当程序在编译期间,编译器会为构造函数中增加为vptr赋值的代码(这是编译器的行为),当程序在运行时,遇到创建对象的代码,执行对象的构造函数,那么这个构造函数里有为这个对象的vptr赋值的语句。 
    二:虚函数表创建时机 
    一个虚函数表通常是一个函数指针数组。虚函数表创建时机是在编译期间。编译期间编译器就为每个类确定好了对应的虚函数表里的内容。 所以在程序运行时,编译器会把虚函数表的首地址赋值给虚函数表指针,所以,这个虚函数表指针就有值了。
    C++中虚函数表位于只读数据段(.rodata),也就是C++内存模型中的常量区;而虚函数则位于代码段(.text),也就是C++内存模型中的代码区。 工作原理参考:c++ 虚函数实现原理_baidu_16370559的博客-CSDN博客

class A{

virtual  void  Func();

}

class B : public A {

virtual  void  Func();

}

A a;基类

B b; 子类 。

A *p = &b;    //多态的既可以通用基类的指针调用子类对象的方法

p->Func();        //调用的是B类对象的函数。 如果Func不是虚函数,调用的是A类对象的函数.

说明:在无虚函数的情况下,基类和派生类都定义相同名称的成员函数,那么通过对象指针调用成员函数时,

必须看该指针的原始类型而定,而不是看指针实际所指对象的类型而定。

注意:不要对数组使用多态 

学习c++ 必知三大特性相关推荐

  1. android api 完整通译之Contacts Provider (学习安卓必知的api,中英文对照)

    android api 完整翻译之Contacts Provider (学习安卓必知的api,中英文对照) Contacts Provider 电话簿(注:联系人,联络人.通信录)提供者 ------ ...

  2. 【Python学习笔记】面向对象三大特性

    2019独角兽企业重金招聘Python工程师标准>>> ★面向对象:封装.继承和多态是面向对象的三大特点★ 面向对象编程简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元 ...

  3. python面向对象三大特性6大原则_【Python学习笔记】面向对象三大特性

    ★面向对象:封装.继承和多态是面向对象的三大特点★ 面向对象编程简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机程序视为 ...

  4. mysql学习--mysql必知必会

    上图为数据库操作分类: 以下的操作参考(mysql必知必会) 创建数据库 执行脚本建表: mysql> create database mytest; Query OK, 1 row affec ...

  5. web前端学习128-134(CSS三大特性---层叠性,继承性,优先级)

    文章目录 1 CSS的三大特性 1.1 层叠性 1.2 继承性 1.3 优先级 1 CSS的三大特性 CSS有三个非常重要的三个特性︰层叠性.继承性.优先级. 1.1 层叠性 相同选择器给设置相同的样 ...

  6. CSS学习笔记5CSS的三大特性与盒子模型

    CSS的三大特性 CSS有三个非常重要的特性:层叠性.继承性.优先级. 层叠性 相同选择器给设置相同的样式,此时一个样式就会覆盖(层叠)另一种冲突的样式.层叠性主要是解决样式冲突的问题 层叠性原则: ...

  7. 学习人工智能必知的7个步骤,零基础也能看懂

    人工智能这个行业,在大多数人的心中都以为还需要很长一段时间才能实现,但其实是我们把人工智能想得太抽象化了,人工智能已经广泛的应用在我们的生活当中了,比如:无人驾驶.智慧语音.医疗检测.人脸识别.智能化 ...

  8. 学习Java必知的超详细基础|【大学生博客大赛】

    初始java 个人见解 我的java个人心得,入门很重要,但是大多数人都搞错了方向,把入门变成了入土: 第一.切记不要一上来就找一大本厚书看.这样你绝对会放弃.<Java核心技术>< ...

  9. 【直播回放】100分钟全面剖析图像分割任务,学习CV必知

    大家好,欢迎来到我们的付费视频直播回放栏目,在这个专栏中我们会每一次针对某一个主题,做1-2个小时左右的直播,包含PPT讲解与答疑交流. 作者&编辑 | 言有三 本文主题与资源 主讲人:言有三 ...

  10. 【直播回放】2小时全面剖析图像分类任务,学习CV必知

    大家好,欢迎来到我们的付费视频直播回放栏目,在这个专栏中我们会每一次针对某一个主题,做1-2个小时左右的直播,包含PPT讲解与答疑交流. 作者&编辑 | 言有三 本文主题与资源 主讲人:郭冰洋 ...

最新文章

  1. oracle minus 与sqlserver except
  2. spring-自动加载配置文件\使用属性文件注入
  3. android 动态文本选取,android-用动态文本更新UI
  4. 【Chromium中文文档】线程
  5. 第十三届“华中杯”大学生数学建模挑战赛题目 A 题 马赛克瓷砖选色问题
  6. 【哈希链表】 146 LRU、LFU缓存机制
  7. vue 打包出现的问题解决
  8. 解决打开VMware虚拟机时Take Ownership出错的问题
  9. 基于 Node.js + Koa 构建完整的 Web API 项目
  10. Nature Communications:使用连接组的嵌入向量表征映射大脑结构与功能之间的高阶关系
  11. 给函数取一个“好”名字
  12. iOS开发:如何使用ShareSDK让APP快速拥有分享功能
  13. esxi能直通的显卡型号_七彩虹RTX SUPER祝融(火神)版显卡上手体验
  14. 【学术】我读科学网“马臻”老师博客体会
  15. 干货!基于层次适应的零样本学习
  16. nginx阻挡flv视频文件上传解决方案
  17. 微信小程序 —— 验证码获取倒计时效果
  18. 主梁弹性模量计算_穿心棒法盖梁施工计算书(工字钢)
  19. 挂载(具名挂载、匿名挂载)
  20. 刘芳2008终极精选【再醉一次 精选】320K/mp3[紫色系]

热门文章

  1. 报名 | 上道沙龙:科技如何赋能传统金融?
  2. 01-老马jQuery教程-jQuery入口函数及选择器
  3. PLIP--Linux 并口网络解决方法
  4. dev gridcontrol 单箱效果
  5. Linux 中断总结
  6. 感谢大家的热情与温暖
  7. Springboot+ Mybatis搭建学习
  8. VueCli4学习笔记
  9. sqlhelp(sqlite)
  10. php基于新浪ip库获取城市,WordPress-利用新浪IP库获取评论用户所在城市信息!