继承易错总结

news2025/2/28 3:44:37

1.继承会将所有的成员继承下来,但是继承方式限定的是继承下来成员的可见类型(如果是private继承,那么他不论哪里都是不可见的;如果是protected继承在类中是可见的,在类外是不可见的;如果是public继承,在任何地方都是可见的)

2.对于静态成员变量,不计入字节大小

3.虚函数类外定义时,不必加virtual

4.编译时多态——静态多态——模板和重载
运行时多态——动态多态——虚函数

友元函数 构造函数 static静态函数 不能用virtual关键字修饰;
普通成员函数 和析构函数 可以用virtual关键字修饰;

静态成员变量类内声明类外初始化
静态成员变量为什么不能设置为虚函数:
静态成员函数不属于任何成员,属于整个类,不能使用this来访问
virtual构成的虚函数,恰恰是使用this指针访问,this->vfptr-> 虚函数地址
静态成员函数没有this指针,实现多态就是需要不同的对象,调用不同的子类进行访问不同的重写函数

class A
{
  static int _tem;//静态成员变量类内声明,类外初始化
};

int A::_tem = 0;//在类外初始化的时候不加static

静态成员变量会继承使用权,但是不能被包含
静态成员变量不存储在类中,计算类的大小的时候不计算他的字节大小

重载:同一个作用域中,函数名相同,参数类型不同,参数数量不同,参数顺序不同
重定义(隐藏):继承中,函数名相同(可使用作用域进行访问)
重写(覆盖):继承的虚函数中,子类重写父类的虚函数

派生类的构造函数,不写会调用默认的构造函数,但是如果自己写,就要自己调用父类的构造函数(在调用父类的构造函数时,要将父类当成一个整体)

class Base
{
public:
	Base()
	{
		puts("Base()");
	}
	Base(int a):_a(a)
	{
		puts("Base(int a)");
	}
	Base(const Base& tem)
	{
		puts("Base(const Base& tem)");
	}
	Base& operator=(const Base& tem)
	{
		puts("Base& operator=(const Base& tem)");
		_a = tem._a;
		return *this;
	}
	~Base()
	{
		puts("Base");
	}
private:
	int _a;
};
class Son:public Base
{
public:
	Son()
	{
		puts("Son()");
	}
	Son(int a, int b)
		:Base(a),_b(b)
	{
		puts("Son(int a,int b)");
	}
	Son(const Son& tem)
		:Base(tem)
	{
		//父类接受子类的对象/引用/指针
		puts("Son(const Son& tem)");
	}
	Son& operator=(const Son& tem)
	{
		puts("Son& operator=(const Son& tem)");
		Base::operator=(tem);
		return *this;
	}
	~Son()
	{
		//在析构函数的时候,可以不手动调用析构函数
		//编译器会自动调用父类的析构函数
		puts("~Son()");
	}
private:
	int _b;
};

inline能不能是虚函数:可以(内敛函数没有地址)
多态调用:内敛不起作用(多态调用中,虚函数存在虚函数表中,需要地址,但是内联函数没有地址,所以内敛不起作用)
普通调用:内敛起作用

构造函数能不能是虚函数?不能
虚表是在编译时生成,构造的时候进行初始化
如果构造函数是虚函数,那么在实例化对象的时候,如何应该去虚表中找构造函数的地址,但是这时候虚表还没有初始化

多态调用和普通函数的时间效率?
具体要看是否构成多态,调用需要到需表中找地址进行调用,普通成员函数可以直接调用

多态的本质——虚表
当父类的指针/引用接收子类的地址/对象时,因为是继承会进行切割,将子类的父类那部分切出来,剩下的就是去虚表中找地址进行调用就行了

父类=子类;会将父类的那部分切出来拷贝给父类,但是不会拷贝虚函数表指针
虚函数指针如果进行了拷贝,那么父类对象的虚函数表指针会发生改变,当使用父类对象调用父类的虚函数时,就会发生错误

虚函数继承,继承的是接口,参数类型不会改变;当子类对象要调用父类的函数时,使用切片的手法进行调用
普通函数继承,继承的是实现


子类和父类都有虚函数,子类的虚函数会存到哪里
在这里插入图片描述

从右表中可以看到,应该是有三个虚函数,他们在同一个虚表中
子类中没有虚表,子类的虚函数存到父类的虚表中

在这里插入图片描述

可以记成向上合并

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

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

相关文章

[机器人-2]:开源MIT Min cheetah机械狗设计(二):机械结构设计

目录 1、四肢朝向的选择 2、电机布局形式的选择 3、电机的选型及测试(非常重要) 4、结构优化 5、尺寸效应 6、其他 1、四肢朝向的选择 机械狗的结构设计,第一个摆在我们面前的就说四肢的朝向问题,如下图,我们是…

白龙地铁消费项目(地铁消费系统,包括用户端、管理端)

大一学的C#可视化项目文件,所有功能均可使用。可以直接下载 下方是演示照片

Vue 3 Composition API:让组件开发更高效、灵活(上)

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…

修改第三方npm包

文章目录 一、前言二、补丁方案2.1、patch-package2.2、pnpm patch 三、换日方案四、总结五、最后 一、前言 在开发过程中,发现某个npm包有Bug,应该怎么办?可以试试下面这2种方案: 代码量少,可以直接修改npm包代码的&…

【计算机四级(网络工程师)笔记】操作系统运行机制

目录 一、中央处理器(CPU) 1.1CPU的状态 1.2指令分类 二、寄存器 2.1寄存器分类 2.2程序状态字(PSW) 三、系统调用 3.1系统调用与一般过程调用的区别 3.2系统调用的分类 四、中断与异常 4.1中断 4.2异常 🌈嗨&#xff…

【LeetCode】每日一题 2023_12_25 不浪费原料的汉堡制作方案(数学,解二元一次方程)

文章目录 刷题前唠嗑题目:不浪费原料的汉堡制作方案题目描述代码与解题思路 结语 刷题前唠嗑 LeetCode?启动!!! 题目:不浪费原料的汉堡制作方案 题目链接:1276. 不浪费原料的汉堡制作方案 题…

详解—数据结构—<常用排序>基本实现和代码分析

目录 一.排序的概念及其运用 1.1排序的概念 1.2排序运用​编辑 1.3 常见的排序算法​编辑 二.常见排序算法的实现 2.1 插入排序 2.1.1基本思想: 2.1.2直接插入排序: 2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序 2.2.1基本思想: …

大模型工具:LangChain 原理与实战案例

LangChain 是什么? LangChain是一个用于开发由语言模型驱动的应用程序的框架。它使得可以构建以下类型的应用程序: 数据感知:将语言模型与其他数据源连接起来 智能:允许语言模型与其环境进行交互 LangChain的主要价值在于&…

【JavaSE】Java进阶知识一(泛型详解,包括泛型方法,协变,逆变,擦除机制)

目录 泛型 1. 什么是泛型 2.泛型方法 3.通配符上界(泛型的协变) 4.通配符下界(泛型的逆变) 5.泛型的编译(擦除机制) 泛型 泛型:就是让一个类能适用于多个类型,就是在封装数据结…

前端---vscode 的基本使用

1. vscode 的基本介绍 全拼是 Visual Studio Code (简称 VS Code) 是由微软研发的一款免费、开源的跨平台代码编辑器,目前是前端(网页)开发使用最多的一款软件开发工具。 2. vscode 的安装 下载网址: Download Visual Studio Code - Mac, Linux, Windows选择对应…

PyQt5和Qt designer的详细安装教程

Qt designer界面和所有组件功能的详细介绍参考:https://blog.csdn.net/qq_43811536/article/details/135186862?spm1001.2014.3001.5501 目录 0. 写在前面1. Anaconda创建虚拟环境2. 安装PyQt5和Qt designer3. 测试安装成功 0. 写在前面 Qt Designer是Qt提供的一种…

Tiny Object Detection

文章目录 RFLA: Gaussian Receptive Field based Label Assignment for Tiny Object Detection(ECCV2022)Dynamic Coarse-to-Fine Learning for Oriented Tiny Object Detection(CVPR2023)TOD-CMLNN(2023) …

RK3568平台开发系列讲解(Linux系统篇)Linux 热拔插机制 mdev的使能

🚀返回专栏总目录 文章目录 一、什么是热插拔二、热插拔的机制三、mdev的开启沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍 Linux 热拔插。 一、什么是热插拔 热插拔是指在设备运行的情况下,能够安全地插入或拔出硬件设备,而无需关闭或重启系统。这意…

关于Nacos各日志以及解决Nacos中疯狂输出日志的问题

目录 前言1. 各日志内容2. 日志解析2.1 服务端日志2.2 客户端日志 前言 越来越发觉硬盘不够用,发现是运行了2年的Nacos中存了很多log日志,具体如下: 于是得了解下各个日志中的作用,防止不必要的输出占用硬盘空间! …

Web前端-JavaScript(Dom高级)

文章目录 1.1 自定义属性操作1.1.1 获取属性值1.1.2 设置属性值1.1.3 移除属性值1.1.4 案例一 1.2 节点操作1.2.1 节点概述1.2.2 节点层级1.2.3 父级节点1.2.4 子节点1.2.5 兄弟节点1.2.6 创建节点1.2.7 添加节点1.2.8 删除节点1.2.9 案例二1.2.10 创建元素的三种方式(了解) 1.…

LabVIEW在横向辅助驾驶系统开发中的应用

LabVIEW在横向辅助驾驶系统开发中的应用 随着横向辅助驾驶技术的快速发展,越来越多的研究致力于提高该系统的效率和安全性。项目针对先进驾驶辅助系统(ADAS)中的横向辅助驾驶进行深入研究。在这项研究中,LabVIEW作为一个强大的系…

GEE数据集——USGS全球地震数据集

美国地质勘探局全球地震数据集 美国地质调查局地震灾害计划 (EHP) 提供全面的地震数据集,为全球监测、研究和地震防备提供宝贵资源。该数据集包含来自各种来源的地震信息,包括地震台、卫星图像和地面观测。持续更新,截至 2023 年 10 月 10 日…

mysql原理--连接查询的成本

1.准备工作 连接查询至少是要有两个表的,只有一个 single_table 表是不够的,所以为了故事的顺利发展,我们直接构造一个和 single_table 表一模一样的 single_table2 表。为了简便起见,我们把 single_table 表称为 s1 表&#xff0…

模糊测试:使用随机输入破坏事物

模糊测试:使用随机输入破坏事物 一个简单的模糊器模糊测试外部程序创建输入文件调用外部程序长时间运行的模糊测试 模糊测试器的发现缓冲区溢出缺少错误检查 我们将从最简单的测试生成技术之一开始,随机文本生成(也称为模糊测试)的…

Spring Cloud Gateway官方文档学习笔记

Spring Cloud Gateway官方文档学习笔记 前言 基础知识:API网关基础知识总结面试题:Spring Cloud Gateway夺命连环10问? 何为网关? 什么是网关?理解成火车站的检票口,统一 检票 网关优点: 统…