首页 > 编程语言 >【C++入门】【六】

【C++入门】【六】

时间:2024-12-04 17:31:02浏览次数:9  
标签:入门 继承 子类 基类 C++ 菱形 派生类 父类

本节目标


一、继承的概念及定义

二、基类和派生类对象赋值转换

三、继承中的作用域

四、派生类的默认成员函数

五、继承与友元

六、继承与静态成员

七、复杂的菱形继承及菱形虚拟继承

八、继承的总结和反思

九、笔试面试题


一、继承的概念及定义

1.继承的概念

  • 继承是面向对象程序设计中是代码可以复用的手段,允许了程序员在原有的类特性上进行扩展,增加功能,这样产生新的类,称为派生类
  • 继承呈现了面向对象程序设计的层次结构
  • 以前我们接触的复用都是函数复用,继承是类设计层次方面的复用
  • 用例如下

2.继承的定义

  • 父类跟子类,也叫基类跟派生类
  • 继承关系和访问限定符:
  • 继承又分为三种继承关系 public protected private
  • 继承后子类对父类的访问又分为三种 public protected private
  • 如果父类也就是基类,里面的函数和变量都是private的,
  • 那么子类/派生类继承后,也无法访问到父类里面的函数和变量
  • 如果父类里面是protected和private 就可以访问
  • protected比较特殊,跟private的不同是,private的所有东西子类和类外都不可以访问
  • 而protected则是 子类可以访问,类外不可以访问
  • 实际中我们都使用public继承,很少使用其他两种

二、基类和派生类对象赋值转换

  • 派生类可以赋值给基类的对象/指针/引用
  • 但是基类不可以赋值给派生类对象
  • 但是基类的指针/引用可以通过强制类型转换来赋值给派生类的指针/引用
  • 派生类赋值给基类时,其实基类是把派生类里自己的东西拿走,其他的东西不拿走,换个说法也叫切割或者切片,就是把派生类中基类的东西切掉赋值过去
  • 切割如图所示(子类student里父类的东西切割 送过去)

三、继承中的作用域

  • 在继承体系中,基类和派生类都有自己的作用域
  • 如果基类和派生类中有同名成员, 子类将屏蔽父类的成员,这种情况叫做隐藏,也叫重定义
  • 如果不想屏蔽掉,想使用同名成员里的父类的,可以通过使用基类::基类成员来进行访问使用
  • 只要函数名相同就构成隐藏,不管返回值类型
  • 在继承体系中最好不要定义同名成员
  • 这里不展示类详细信息,看结论 

四、派生类中的默认成员函数

  • 还是6个默认成员函数
  • 父类里面的成员变量 必须 通过父类的构造函数来初始化,子类不能初始化

五、继承和友元

  • 友元关系不能继承
  • 基类的友元不能访问子类的私有成员和保护成员

六、继承与静态成员

  • 基类如果定义了static静态成员,则整个继承体系里只有一个这样的成员
  • 子类也共用,无论派生出多少子类,都只有一个static成员
  • 额外补充 注意: static静态成员在类中声明,类外初始化 类外初始化不用加static
  • 比较简单,这里不做演示

七、复杂的菱形继承及菱形虚拟继承

1.各种继承

  • 单继承
  • 一个子类只有一个直接父类就叫单继承
  • 多继承
  • 一个子类有两个及以上直接父类叫多继承
  • 菱形继承
  • 菱形继承是多继承的一种特殊情况
  • 关于菱形继承 有着很大的问题,由于多继承的出现就导致了菱形继承
  • 观察上图
  • student和teacher两个类继承了person 
  • 而assistant又同是继承了他俩
  • 那么在assistant里面 就有了两个同名的成员变量,此时如果访问的话,编译器就不知道是访问的谁的 student还是teacher的

2.虚拟继承

  • 为了解决掉这个问题
  • 此时出现了虚拟继承
  • 虚拟继承可以解决菱形继承中的二义性和数据冗余
  • 在上面的student和teacher 继承 person时加上virtual 即可解决问题
  • 注意:虚拟继承不要在其他地方使用 仅限于菱形继承

3.虚拟继承解决数据冗余和二义性的原理

  • 为了研究虚拟继承原理,我们给出了一个简化的菱形继承继承体系

八、继承的总结和反思

  • 很多人说C++语法复杂,其实多继承就是一个体现,有了多继承,就存在了菱形继承,有了菱形继承就有了虚拟继承,底层实现就很复杂,所以一般不建议设计出多继承,在java里面是没有多继承的,菱形继承一定不要设计出来,复杂性太高
  • 多继承可以认为是C++的缺陷之一
  • 继承和组合
  • 继承是is的关系,组合是has的关系
  • 优先使用组合,而不是继承
  • 什么是组合? 下图  这里没用继承 将轮胎给到了车上

九、笔试面试题

  • 1.什么是菱形继承?菱形继承的问题是什么?
  • 2.什么是菱形虚拟继承,如何解决数据冗余和二义性的?
  • 3.继承和组合的区别?什么时候用继承?什么时候用组合?

标签:入门,继承,子类,基类,C++,菱形,派生类,父类
From: https://blog.csdn.net/iiiiisss/article/details/144242812

相关文章

  • Nodejs Express.js 快速入门(详细流程)
    一、简介安装nodejs,推荐使用nvm管理安装。二、创建项目(方式一:空项目手动创建)新建项目文件夹express-demo,cd进入文件夹后,使用命令创建package.json文件:#进入项目文件夹执行下面初始化命令,二选一即可,反正创建了可以后期调整的$cdexpress-demo#方式一:需要......
  • Three.js入门-相机控制器
    Three.js入门-相机控制器概念介绍在开始前,我们先看一下效果,我在场景中创建了一个立方体,当我们点击鼠标左键并拖动时,可以旋转相机视角,滚动鼠标滚轮可以缩放相机视角。相信看了动图效果,大家对相机控件有了一个直观的认识。它是Three.js中用于控制相机的工具,可以帮助用户在3......
  • 求教0基础入门大模型的学习路线?java出身,数学良好,希望入局大模型算法,有无必要从cnn学起
    目录前排提示,文末有大模型AGI-CSDN独家资料包哦!前言本人本科学历java开发出身,数学基础良好,希望入局大模型算法,有无必要从cnn学起?transformer、bert是否必须要学?希望能在最短的时间掌握相关知识…近年来,随着大模型的火爆,他的领域几乎涉及到了生活中的方方面面:那么如何快......
  • 打卡信奥刷题(360)用C++工具信奥P3353[普及组/提高] 在你窗外闪耀的星星
    在你窗外闪耀的星星题目背景飞逝的的时光不会模糊我对你的记忆。难以相信从我第一次见到你以来已经过去了3年。我仍然还生动地记得,3年前,在美丽的集美中学,从我看到你微笑着走出教室,你将头向后仰,柔和的晚霞照耀着你玫瑰色的脸颊。我明白,我已经沉醉于你了。之后,经过几个月......
  • 超分辨率入门
            超分辨率(Super-Resolution),简称超分(SR)。是指利用光学及其相关光学知识,根据已知图像信息恢复图像细节和其他数据信息的过程,简单来说就是增大图像的分辨率,防止其图像质量下降。就是将低分辨率(lowresolution,LR)的图像通过算法提升到高分辨率(highresolutio......
  • Python扩展C/C++ 实现原理分析
    Python扩展C/C++实现原理分析https://blog.csdn.net/HaoBBNuanMM/article/details/112243129?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522ab2ac79057d38453c0328d6726560514%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request......
  • CAD 二次开发入门与实践:以 C# 为例
    摘要: 本文详细介绍了如何使用C#进行CAD软件的二次开发。首先阐述了CAD二次开发的概念、意义与应用场景,接着深入探讨了开发环境的搭建,包括CAD相关API的引用与C#开发工具的配置。随后重点讲解了基于C#的CAD二次开发的核心技术,如基本图形绘制、图层管理、块操作......
  • 总结9大常见Web漏洞,网安小白零基础入门到精通看这一篇就够了!
    0x01前言Web漏洞通常是指网站程序上的漏洞,可能是由于代码编写者在编写代码时考虑不周全等原因而造成的漏洞。是Web安全的核心内容。本文简单总结了几个常见的Web漏洞。0x02SQL注入漏洞SQL注入漏洞是指攻击者通过把恶意的SQL语句插入到网站的输入参数中,来绕过网站的......
  • 网络安全入门教程(非常详细)从零基础入门到精通_网路安全 教程
     前言1.入行网络安全这是一条坚持的道路,三分钟的热情可以放弃往下看了。2.多练多想,不要离开了教程什么都不会了,最好看完教程自己独立完成技术方面的开发。3.有时多百度,我们往往都遇不到好心的大神,谁会无聊天天给你做解答。4.遇到实在搞不懂的,可以先放放,以后再来解决。→【......
  • 《 C++ 点滴漫谈: 六 》不可改变的力量:const 编程世界的安全卫士
    摘要const关键字是C++中不可或缺的组成部分,其核心作用在于提升代码的安全性、可读性和性能优化能力。本文深入剖析了const的基本概念及其在变量、函数、指针、引用和类中的具体应用,同时详细解析了const_cast的用法与潜在风险。此外,文章探讨了const的优势与局限,为......