C++面向对象的三种方式

封装

在C++里面,可以用class来定义一个类,而这个类与C语言中static很像,它们都可以让用户自己定义一个数据类型,不同的是,类中还可以有函数,而类中的数据又有三种类型,分别为public(公共的),protect(保护的),private(私有的)。

  • 封装可以隐藏实现细节,使得代码模块化,使代码和功能独立

  • 封装是把函数和数据包含在一个类里,数据只能通过函数或可以信任的对象进行访问,对不可信的对象进行隐藏

继承

继承:一个类可以使用另外一个类的所有功能,并在无需重新编写的情况下对继承过来的类进行补充扩展。

通过继承而来的类又被称为“子类”,被继承的类被称为“父类”或者“基类”。

继承的三种实现方式

  1. 实现继承:直接使用基类的属性和方法而无需额外编码

  1. 接口继承:指仅仅使用属性和方法的名称,但是子类必须提供代码的实现

  1. 可视继承:指子窗体(类)使用基窗体(类)的外观和实现代码的能力

单一继承

子类只继承了一个父类,这种情况称为单一继承,一般情况下都使用单一继承,使用多重继承容易造成混乱

多重继承

一个子类继承了多个父类,类与类之间要用逗号隔开,类名之前要有继承权限,假使两个或两个基类都有某变量或函数,在子类中调用时需要加类名限定符如c.a::i = 1;

菱形继承

假设有一个基类A,他有两个子类B和C都继承了A中的某个函数并且都进行了重写,此时又有一个子类用多重继承了B和C,那么此时就有出现一种情况,例如:

//  菱形继承 菱形继承是多继承的一种特殊情况。
//菱形继承的问题:从下面的对象成员模型构造,可以看出菱形继承有数据冗余和二义性的问题。class A
{
public:int m_a = 1;
};
class B :public A
{
public:int m_b = 2;
};
class C :public A
{
public:int m_c = 3;
};
class D :public B, public C
{
public:int m_d = 4;
};
void main()
{D d;d.m_d = 40;d.m_c = 30;d.m_b = 20;//.m_a = 10;//  二义性// 不能够访问  因为B 和C分别继承了A的m_a//但是D 继承了B和C的m_a 所以D不能够分辨m_a到底是谁的d.B::m_a = 100;d.C::m_a = 200;// 这样的话 就造成了m_a 有两个空间  一个B的100  一个C的200
}
如何解决菱形继承的问题呢?
  • 最简单的,就是尽量不要出现菱形继承这种情况。

  • 如果一定会用到菱形继承的话,可以用虚基类来解决,关于什么是虚基类,往下接着看吧

  • 虚基表的引入也可以解决这个问题

  • 详细可见:http://t.csdn.cn/x0ZB3

多态

一个接口多种方法,即用同一个接口,但是效果不同

静态多态

是在编译期就把函数链接起来,此时即可确定调用哪个函数或模板,静态多态是由模板和重载实现的,在宏多态中,是通过定义变量,编译时直接把变量替换,实现宏多态。

模板

template <class T>定义一个模板。

详情请见:http://t.csdn.cn/QJqBk

重载

重载又有函数重载和运算符重载。

函数重载详情请见:http://t.csdn.cn/iwGFT

运算符重载请见:http://t.csdn.cn/vMRYM

动态多态

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

使用时在父类中写一个虚函数,在子类中分别重写,用这个父类指针调用这个虚函数,它实际上会调用各自子类重写的虚函数。

输出:
call child func
call ~base
虚函数

用virtual关键字修饰的函数;

本质上由虚指针和虚表控制,虚指针指向虚表中的某个函数入口地址,就实现了多态

详细请见:http://t.csdn.cn/uAqtx

构造函数可以是虚函数吗?

答:不可以,因为我们知道有虚函数的类在创建实例的时候会通过构造函数创建虚函数表,当调用虚函数的时候需要通过虚指针指向虚函数来调用,那么问题来了,当我们创建一个构造函数是虚函数的实例的时候,需要调用构造函数,而构造函数又因为是虚函数需要有虚函数表,那么此时就矛盾了,所以构造函数不可以是虚函数。

析构函数可以是虚函数吗

析构函数可以是虚函数,且常常如此

这个就好理解了,因为此时 vtable 已经初始化了;况且我们通常通过基类的指针来销毁对象,如果析构函数不为虚的话,就不能正确识别对象类型,从而不能正确销毁对象。

多态存在的三个必要条件

  • 继承

  • 重写

  • 父类引用指向子类对象

实现多态的方法
  • 面向对象有了一个重要的概念就是对象的实例,对象的实例代表一个具体的对象,所以肯定有一个数据结构来保存这一实例的数据,这一数据包括对象变量成员,如果对象有虚函数方法或存在虚函数的话,则还有对应的虚函数或虚表指针,不包括其他函数指针

  • 虚函数在c++中的实现机制就是用虚表和虚指针,是每个类用了一个虚表,每个类的对象用了一个虚指针。要讲虚函数机制,必须讲继承,因为只有继承才有虚函数的动态绑定功能

  • 详细可见上面的虚函数的知识

内容借鉴:http://t.csdn.cn/voK62

1.26 春节摆烂结束,开始备战实习!冲冲冲!

C++的封装、继承和多态相关推荐

  1. java 继承重写_java 封装 继承 重写 多态

    封装:是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. 好处: 将变化隔离.便于使用.提高重用性.提高安全性 封装原则: 将不需要对外提供的内容都隐藏起来.把属性都隐藏,提供公共方法对其访问. ...

  2. 面向对象 详解笔记 方法 类 对象 封装 继承 重写 多态 接口

    文章目录 面向过程&面向对象 面向过程 面向对象 什么是面向对象 回顾方法及加深 方法的定义 修饰符 返回类型 break:跳出switch,结束循环和return的区别 方法名:注意规范就o ...

  3. 本质论之封装继承和多态的介绍

    关于 类,我有一些话想说 说到类那就说到了面向对象的灵魂了,没有它也就没有了封装.继承and多态这些东西了.我还记得在读研期间每次看到这些都望而却步,甚至我搞不懂对象和类的区别(这里防止有人也不知道区 ...

  4. 黑马程序员_JAVA之面向对象(封装,继承和多态)

    ------- android培训.java培训.期待与您交流!---------- 面向对象 一.面向对象概述 定义: 面向对象(Object Oriented,OO)是软件开过过程中使用一种思维方 ...

  5. Java回顾 封装 继承和多态

    封装 什么是封装 封装:就是隐藏对象的属性和实现细节,仅对外提供公共访问方式. 封装时的权限控制符区别如下: 封装的意义 对于封装而言,一个对象它所封装的是自己的属性和方法,所以它是不需要依赖其他对象 ...

  6. java 封装 继承和多态

    2019独角兽企业重金招聘Python工程师标准>>> 多态无处不在.引用的概念最为困难.理解了引用才能理解多态的意义以及应用. 多态的应用的一大前提是继承.以及继承中的重写方法.继 ...

  7. python类与对象 封装继承与多态 0308

    类与对象 初始化方法 init方法 带参实例化类 del方法 str方法 私有 继承 方法的重写 super 父类名称调父类方法 调用父类私有 间接调用 多继承 新式类经曲类 多态 类属性 类方法 静 ...

  8. 07 面向对象编程-结构、封装、继承、多态、接口

    文章目录 Struct定义 struct 方法 工厂模式 面向对象三大特性 封装 继承 接口 多态 Golang支持面向对象编程,但是和传统面向对象有区别,并不是纯粹面向对象的语言,只能说Golang ...

  9. 浅谈对于封装、继承与多态的理解(Java)

    目录 封装 继承 父类成员的访问 如何在子类中访问父类同名的成员 子类构造方法 代码块在继承上的执行顺序 多态 多态的实现条件 重写 多态的优缺点 面向对象程序的三大特征:封装继承和多态. 封装 · ...

  10. Java三大特性:封装,继承与多态

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/84592274冷血之心的博客) 目录 (一)封装 封装的定义 封装 ...

最新文章

  1. Adam那么棒,为什么还对SGD念念不忘 (1) —— 一个框架看懂优化算法
  2. 第二十一课.GBDT
  3. linux进程间通讯-共享内存
  4. 网易SRC指责白帽子私自披露已修复漏洞,强势表态违刑必究
  5. 在XML中发送二进制数据
  6. Linux软件安装小结
  7. 第44课 角谷猜想 动动脑 第3题 完善程序
  8. clistctrl 列不可按 -baijiahao_好吃到让人尖叫的日本人气美食 | 不可错过的京都吃喝地图...
  9. UESTC1608 暑假集训
  10. “10亿元身价”CEO的6个密码
  11. jquery日历插件 途牛_为开发者准备的10款最好的jQuery日历插件
  12. 在线HTTP接口测试 - HTTP GET/POST模拟请求测试工具
  13. 中南大学c语言课程设计报告,中南大学 C++课程设计报告.doc
  14. 【华为联机对战】下载运行华为官方Unity示例代码,提示鉴权失败并返回错误码100114
  15. 浅谈TPM设备管理系统、推行要素和目的
  16. Google证书生成
  17. 在 Amazon SageMaker 上玩转 Stable Diffusion: 基于 Dreambooth 的模型微调
  18. JS中的BOM、正则表达式、定时器
  19. RuoYi-App启动教程
  20. html5 幽灵按钮,弥散阴影幽灵按钮

热门文章

  1. CityMaker研修之路 02 伟景行(CityMaker)的倾斜之路
  2. 均衡负载集群(LBC)-2
  3. PmxEditor制作mmd表情
  4. Java,基于简单输入的薪水计算器
  5. python中seaborn是什么_Python-Seaborn绘图(matplotlib补充)
  6. h5活动是什么意思_H5页面到底是什么?
  7. 算法:分治策略和递归1 | 通过迭代来学习递归
  8. Solidity入门级别|用智能合约实现房屋贷款系统
  9. 三星 盖世3 刷CM10.2 请插入sim卡
  10. 那些你觉得堪称神兵利器的 Chrome 插件