【c++】 继承的相关问题

news2024/9/27 19:21:19

继承

  • 无论是那种继承方式,基类继承的私有属性都无法访问
  • 不论父类中的属性被啥修饰,都会被子类全盘接收
  • public,protected,private继承
    • private 继承和protected 继承都是类中可以访问,类外无法访问,这有什么区别呐?
  • 继承的内存布局
  • 当出现多继承时,子类构建对象时,按照继承顺序,依次调用基类的构造函数
  • 派生类创建对象时,每次都会默认调用基类的构造函数
  • 在两个类(一个继承一个)中,如果出现相同的静态变量,虽然它俩都属于整个类,名字相同,但它们不会出现覆盖的情况,它们各种的作用域在各种的类中。
  • 不想让子类继承的化话可以加final关键字
  • 如果基类和子类有相同名称函数,那么在子类中,父类的该函数就会被同名隐藏起来了,
    • 想调用的话,就必须加上作用域
    • 就算是参数列表不同,也不能构成函数重载,必须显式的去调用
  • Y形问题:
  • 菱形问题
  • 先组合,再继承
  • 先继承,再组合,同时有自己的私有属性
  • 继承时虚表的情况
    • 通过指针的转换调用虚函数
    • 派生类继承基类的虚函数时,会将基类中的虚函数的地址原封不动的继承下来
    • 当派生类重写基类中的方法后,派生类的虚表中对应的该函数将被重写,其它的函数不变
    • 当派生类有虚函数时,会把自己的虚函数加入到从基类继承的虚函数的后面
    • 当多继承时,派生类会把自己的虚函数加到第一个类的虚表指针后面
    • 当基类里面有三个相同名称的虚函数,当派生类继承并改写时,会把三个虚表中的虚函数全部改了
  • 公有继承:是一个
  • 基类只会继承父类的构造函数,不会继承拷贝构造
  • 同时,赋值重载也也一样,不过我们可以通过指针强制来解决
  • 隐藏
  • 注意

继承:类型层次设计中提高代码的复用程度的重要手段。
派生:保持原有的属性上进行扩展,增加新属性和方法,以形成新的类型

继承权限和访问权限一样,都有三个: public protected private
派生类时可以分四步

1 .吸收基类的成员 不论是数据成员,还是函数成员,除构造函数外全盘接收
2.改造基类成员 当父类有virtual,声明一个与基类成员同名,同参,同返回类型(返回基类指针除外)的新成员。当父类无virtual,申明一个与基类同名的函数,进行隐藏。
3.发展新成员 派生类新成员必须与基类成员不同名,它的加入保证派生类在功能上有所发展,独特的新成员才是继承与派生的核心特征
4.析构函数

无论是那种继承方式,基类继承的私有属性都无法访问

在这里插入图片描述

不论父类中的属性被啥修饰,都会被子类全盘接收

在这里插入图片描述

public,protected,private继承

在这里插入图片描述
1.通过public继承,基类里面public继承过来的,还是public,基类里面是protected,还是protected
2.通过protected继承,把基类中的public变成了protected
3.通过private继承,把基类汇总的public 和 protected 变成了private

private 继承和protected 继承都是类中可以访问,类外无法访问,这有什么区别呐?

在这里插入图片描述
通过private继承,可以把基类中的属性全部变成private,从而当子类继承时,自己类中从父类继承的属性全部无法访问

继承的内存布局

在这里插入图片描述
H类的内存布局
在这里插入图片描述

当出现多继承时,子类构建对象时,按照继承顺序,依次调用基类的构造函数

在这里插入图片描述

派生类创建对象时,每次都会默认调用基类的构造函数

在这里插入图片描述

在两个类(一个继承一个)中,如果出现相同的静态变量,虽然它俩都属于整个类,名字相同,但它们不会出现覆盖的情况,它们各种的作用域在各种的类中。

在这里插入图片描述

不想让子类继承的化话可以加final关键字

在这里插入图片描述

如果基类和子类有相同名称函数,那么在子类中,父类的该函数就会被同名隐藏起来了,

在这里插入图片描述

想调用的话,就必须加上作用域

在这里插入图片描述

就算是参数列表不同,也不能构成函数重载,必须显式的去调用

在这里插入图片描述

Y形问题:

在这里插入图片描述
调用的时候会出现二义性

显示的调用
在这里插入图片描述

菱形问题

在这里插入图片描述
调用的时候还会出现二义性

这样我们使用虚继承就可以了
在这里插入图片描述
当创建SofoBad对象时,先调用其默认的构造函数,因为它继承了其它的类,所以先调用基类构造函数,因为Sofo在Bad前面,所以先调用Sofo的构造函数,Sofo同样先调用Furuiture的构造函数,接着构造Furuiture的对象,然后构造出Sofo的对象,然后调用Bad的构造函数,同样也会先调用Furuiture的构造函数,不过因为之前已经调用过,所以不需要再次调用。

先组合,再继承

它的对象创建顺序,先按照父类对象成员属性中设计的顺序依次构造,接着构造父类对象,接着构造派生类对象。
在这里插入图片描述

先继承,再组合,同时有自己的私有属性

它的对象创建顺序,先按继承顺序构建父类对象,然后创建派生对象时,按照其成员属性的定义顺序创建对象。
在这里插入图片描述
在这里插入图片描述

继承时虚表的情况

如果一个类中有虚函数,则生成的该对象中会有一个虚指针,该指针指向一个虚表,该虚表中存储着所有虚函数的入口地址(此时这个表中没有存da函数的地址,因为它不是虚函数)
在这里插入图片描述
在这里插入图片描述

通过指针的转换调用虚函数

在这里插入图片描述

派生类继承基类的虚函数时,会将基类中的虚函数的地址原封不动的继承下来

在这里插入图片描述

当派生类重写基类中的方法后,派生类的虚表中对应的该函数将被重写,其它的函数不变

在这里插入图片描述

当派生类有虚函数时,会把自己的虚函数加入到从基类继承的虚函数的后面

在这里插入图片描述
在这里插入图片描述

当多继承时,派生类会把自己的虚函数加到第一个类的虚表指针后面

D从3个有虚函数的类继承下来,所以它里面有3个虚指针,
D类中的虚函数添加到了从A类继承下来的虚表中了
在这里插入图片描述

当基类里面有三个相同名称的虚函数,当派生类继承并改写时,会把三个虚表中的虚函数全部改了

在这里插入图片描述

公有继承:是一个

1.派生类的对象可以赋值给基类的对象(切片),这时是把派生类中从基类继承过来的隐藏对象赋值给基类对象,反过来不行,因为派生类的新成员无值可赋

2.可以将一个派生类的对象的地址赋值给基类对象,不过只能通过这个指针访问派生类中由基类继承过来的隐藏对象,不能访问派生类中的新成员。

3.派生类对象可以可以初始话基类的引用,但这个别名只能包含派生类对象中由基类继承过来的隐藏对象

基类只会继承父类的构造函数,不会继承拷贝构造

在这里插入图片描述
当使用基类对象拷贝构造另一个对象时,当创建父类时,并不会调用父类的拷贝构造,而是调用构造函数,当我们想要调用父类的拷贝构造时,需要自己显示调用
在这里插入图片描述
这种和上面的不一样,这种也是调用基类的构造,在构成作用域中,创建了一个基类匿名对象,然后析构了
在这里插入图片描述

同时,赋值重载也也一样,不过我们可以通过指针强制来解决


class Base
{
private:
	int b_value;
public:
	Base(int value = 0) :b_value(value) { std::cout << "Create Base" << std::endl; }
	Base(const Base& base) :b_value(base.b_value) { std::cout << "Copy Base" << std::endl; }
	Base& operator =(const Base& base)
	{
		if (this != &base)
		{
			b_value = base.b_value;
		}
		

	}

};
class Child :public Base
{private:
	int c_value;
public:
	Child(int value = 0) :c_value(value) { std::cout << "Create Chile" << std::endl; }
	Child(const Child& child) :c_value(child.c_value) 
	{
		Base(child); 
		std::cout << "Copy Child" << std::endl;
	}
	Child& operator =(const Child& child)
	{
		if (this != &child)
		{
			*(Base*)this = child;
			c_value = child.c_value;
		}
	  

	}

};

隐藏

非虚函数:只要子类与父类中的函数名相同
虚函数:子类中的函数与父类中函数的名字相同,参数不同,当子类中的函数与父类中函数名字,参数,返回值相同时则为重写。

注意

1.当派生类继承基类中的纯虚函数时,派生类只继承了基类中的函数名字,函数具体的实现是由派生类来实现的
2.假如给虚函数返回值写 return 0.0f;它实现了一部分,因此也不会强制派生类实现这个函数
3.不要同名隐藏基类中的非虚方法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

区间信息维护与查询【最近公共祖先LCA 】 - 原理

区间信息维护与查询【最近公共祖先LCA 】 - 原理 最近公共祖先&#xff08;Lowest Common Ancestors&#xff0c;LCA&#xff09;指有根树中距离两个节点最近的公共祖先。 祖先指从当前节点到树根路径上的所有节点。 u 和v 的公共祖先指一个节点既是u 的祖先&#xff0c;又是…

React基础之Context

前文有讲到Vue中的provide透传&#xff0c;祖孙组件之间通信。在react中也有类似的存在&#xff0c;他就是context&#xff0c;context的作用也是让祖孙组件之前通信。 React中&#xff0c;通过createContext方法来创建一个Context对象。 import React, { createContext } fr…

sqli-labs/Less-51

这一关的欢迎界面依然是以sort作为注入点 我们首先来判断一下是否为数字型注入 输入如下 sortrand() 对尝试几次 发现页面并没有发生变化 说明这道题的注入类型属于字符型 然后尝试输入以下内容 sort1 报错了 报错信息如下 我们从报错信息可以知道这道题的注入类型属于单…

JS-基础

JavaScript 基础第一天 01 JavaScript介绍 1.1 JavaScript 注释 单行注释 符号&#xff1a;//作用&#xff1a;//右边这一行的代码会被忽略快捷键&#xff1a;ctrl / 块注释 符号&#xff1a;/* */作用&#xff1a;在/* 和 */ 之间的所有内容都会被忽略快捷键&#xff1a;s…

【附源码】计算机毕业设计JAVA移动在线点菜系统服务端服务端

【附源码】计算机毕业设计JAVA移动在线点菜系统服务端服务端 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1…

【Unity】TimeLine系列教程——编排剧情!

前言 我们经常会看到游戏中有很多“花里胡哨”的系统&#xff0c;比如这样&#xff1a; 火影忍着疾风传 碧之轨迹S技能 这种效果感觉上像播放视频一样&#xff0c;但是却能将游戏不同的敌人加到镜头里面&#xff0c;有时候甚至根据双方关系还会有不同的反馈。如果是做视频或…

基于DQN的强化学习 快速浏览(基础知识+示例代码)

一、强化学习的基础概念 强化学习中有2个主要的实体&#xff0c;一个是智能体(agent)&#xff0c;另一个是环境(environment)。在强化学习过程中&#xff0c;智能体能够得到的是环境当前的状态(State)&#xff0c;即环境智能体所处环境当前的情况。另一个是上一步获得的环境的…

NePTuNe 论文笔记

NePTuNe:Neural Powered Tucker Network for Knowledge Graph Completion- Introduction- Background- Algorithm- Experiment- Conclusion- CodeShashank Sonkar, Arzoo Katiyar, Richard G.Baraniuk - Introduction 目前的链接预测方法&#xff1a; 张量因式分解&#xff1…

【服务器数据恢复】raidz多块硬盘离线的数据恢复案例

服务器数据恢复环境&#xff1a; 一台采用zfs文件系统的服务器&#xff0c;配备32块硬盘。 服务器故障&#xff1a; 服务器在运行过程中崩溃&#xff0c;经过初步检测没有发现服务器有物理故障&#xff0c;重启服务器后故障依旧&#xff0c;用户联系我们中心要求恢复服务器数据…

SpringBoot: Controller层的优雅实现

目录1. 实现目标2. 统一状态码3. 统一响应体4. 统一异常5. 统一入参校验6. 统一返回结果7. 统一异常处理8. 验证1. 实现目标 优雅校验接口入参响应体格式统一处理异常统一处理 2. 统一状态码 创建状态码接口&#xff0c;所有状态码必须实现这个接口&#xff0c;统一标准 pa…

Eolink 征文活动- -专为开发者设计的一款国产免费 API 协作平台

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; ▌背景 后端开发的程序员都需要有一个用得顺手的接口测试工具&#xff1b;以前&#xff0c;大家都喜欢用Google开发的一款接口测试工具postman来进行测试&#xff0c;…

Java面向对象三大基本特征之多态

多态性是面向对象编程的又一个重要特征&#xff0c;那么多态是什么呢&#xff1f; 一、多态的概念 1.概念&#xff1a;多态是指在父类中定义的属性和方法被子类继承之后&#xff0c;可以具有不同的数据类型或表现出不同的行为&#xff0c;这使得同一个属性或方法在父类及其各…

Linux 文件操作(一) —— 遍历指定目录下的所有文件

目录 一、访问目录相关函数 1、打开/访问目录 (opendir / fdopendir) 2、读取目录内容 (readdir) 3、关闭目录 (closedir) 二、遍历指定目录下的所有文件 一、访问目录相关函数 1、打开/访问目录 (opendir / fdopendir) opendir / fdopendir 函数的作用是访问指定路径的…

工程基建--前端基建

序&#xff1a; 工程基建 &#xff1a; 编码规范、api规范、前后端协作、环境部署、微服务、微前端、性能、安全防御、统计监控、可视化 等等的建设&#xff1b; 后端基建&#xff1a; 后端规范文档、后端模板、安全、日志、微服务、RESTful API、中间件、数据库、分布式、权…

新手怎么做微信商城小程序_微信商城小程序模版哪里找

微信小程序已经在我们的生活中随处可见&#xff0c;甚至是抖音头条等其它的平台也开始做起了小程序&#xff0c;在这种情况下&#xff0c;微信小程序势必会成为未来商城的主战场之一。闻风而来想做小程序的人不少&#xff0c;而其中新手零基础也能做的小程序商城模板类工具&…

C++入门教程2||C++ 数据类型

C 数据类型 使用编程语言进行编程时&#xff0c;需要用到各种变量来存储各种信息。变量保留的是它所存储的值的内存位置。这意味着&#xff0c;当您创建一个变量时&#xff0c;就会在内存中保留一些空间。 您可能需要存储各种数据类型&#xff08;比如字符型、宽字符型、整型…

【Leetcode】15. 三数之和

一、题目 难度不小 注意是不能重复 Python提交格式&#xff0c;返回一个list 二、暴力解法 排序 三重循环 有没有像我这样的傻子&#xff0c;三重循环&#xff0c;还没去重 后来发现要去重&#xff0c;必须要先排序&#xff0c;然后判断一下当前的数是否跟前面那个数相同&am…

SpringBoot项目如何优雅的实现操作日志记录

前言 大家好&#xff0c;我是希留。 在实际开发当中&#xff0c;对于某些关键业务&#xff0c;我们通常需要记录该操作的内容&#xff0c;一个操作调一次记录方法&#xff0c;每次还得去收集参数等等&#xff0c;会造成大量代码重复。 我们希望代码中只有业务相关的操作&…

html5期末大作业 基于HTML+CSS制作dr钻戒官网5个页面 企业网站制作

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

Java中的多重继承问题

继承是面向对象编程 &#xff08;OOP&#xff09; 语言&#xff08;如Java&#xff09;的主要功能之一。它是一种以增强软件设计中类重用能力的方式组织类的基本技术。多重继承是众多继承类型之一&#xff0c;是继承机制的重要原则。但是&#xff0c;它因在类之间建立模棱两可的…