当前位置: 首页 > news >正文

C++:类与对象——详解继承、多继承、虚继承

1. 继承

优点:减少重复的代码

语法class 子类 : 继承方式 父类

子类也称为派生类,父类也称为基类

2. 继承方式

  1. 公共继承:public
  2. 保护继承:protected
  3. 私有继承:private

注意

  • public继承方式使得基类的public成员可以被派生类的对象访问,它可以实现类之间的子类型关系
  • protected继承使得基类的public成员不能被派生类的对象访问,但可以被派生类的派生类访问
  • private继承使得基类的public成员既不能被派生类的对象访问,也不能被派生类的派生类访问
  • 父类中所有非静态成员属性都会被子类继承下去,父类中私有成员属性是被编译器隐藏了,因此是访问不到,但是确实被继承下去了

3. 继承中构造和析构顺序

  • 先执行基类的构造函数,再执行派生类的构造函数
  • 先执行派生类的析构函数,再执行基类的析构函数

4. 继承中同名成员处理方式

若子类与父类出现同名成员,如何通过子类对象访问这些成员:

  • 访问子类同名成员,直接访问即可
  • 访问父类同名成员,需要加父类作用域

注意

  • 如果子类中出现和父类同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数,加作用域可以访问到父类中同名函数

5. 继承中同名静态成员处理方式

  1. 通过对象访问:静态与非静态成员出现同名,处理方式一致
  2. 通过类名访问

6. 多继承

c++允许一个类继承多个类

语法class 子类 : 继承方式 父类1 , 继承方式 父类2...

注意:多继承可能引发父类中有同名成员出现,需要加作用域加以区分

7. 菱形继承

概念:两个派生类继承同一个基类,又有某个类同时继承两个派生类,这种继承叫做菱形继承或钻石继承;

问题:我们将继承两个派生类的派生类称为孙子类,那么意味着孙子类有两个父类、一个爷爷类,那么问题是:两个父类都继承了爷爷类的数据,当孙子类使用数据时就会产生二义性,孙子继承了两份爷爷类的数据,其实这种数据孙子类只需要一份就可以,如何解决?

解决方案:利用虚继承virtual)可以解决菱形继承的问题

在下面代码中,Animal称为虚基类SheepTuoSheepTuo继承得到的是一个m_Age和两个虚基指针,两个虚基指针通过偏移量找到唯一的数据m_Age

class Animal{
public:int m_Age;
};class Sheep : virtual public Animal{};class Tuo : virtual public Animal{};class SheepTuo : public Sheep, public Tuo{};

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • SQL进阶技巧:每年在校人数统计 | 区间重叠问题
  • Python网络爬虫:如何高效获取网络数据
  • Python 基本库用法:数学建模
  • 黄仁勋的思维世界:Nvidia的AI和游戏之王
  • 论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS
  • C++当中的多态(三)
  • pytorch对不同的可调参数,分配不同的学习率
  • xxl-job
  • [C++]spdlog学习
  • P5735 【深基7.例1】距离函数
  • 【可测试性实践】C++ 单元测试代码覆盖率统计入门
  • 用go语言实现树和哈希表算法
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • Qt什么时候触发paintEvent事件
  • Selenium 实现图片验证码识别
  • Electron入门介绍
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • Linux链接文件
  • Spring Boot快速入门(一):Hello Spring Boot
  • VUE es6技巧写法(持续更新中~~~)
  • 翻译--Thinking in React
  • 世界上最简单的无等待算法(getAndIncrement)
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • ​字​节​一​面​
  • #!/usr/bin/python与#!/usr/bin/env python的区别
  • #define与typedef区别
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • (ibm)Java 语言的 XPath API
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (强烈推荐)移动端音视频从零到上手(上)
  • (十)T检验-第一部分
  • (十六)视图变换 正交投影 透视投影
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)c52学习之旅-流水LED灯
  • (转载)Linux 多线程条件变量同步
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • **CI中自动类加载的用法总结
  • .NET CLR Hosting 简介
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .net dataexcel 脚本公式 函数源码
  • .Net IE10 _doPostBack 未定义
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc
  • .NET应用UI框架DevExpress XAF v24.1 - 可用性进一步增强
  • /run/containerd/containerd.sock connect: connection refused
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @EnableAsync和@Async开始异步任务支持
  • @TableLogic注解说明,以及对增删改查的影响
  • [16/N]论得趣
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [Asp.net mvc]国际化