关于C++ Overload、Override、hide的一些总结

2023-05-16

一、override和overload区别
当需要一些相同的函数名接受不同的参数实现不同的功能时,可以是运用函数重载来实现。但是,函数的重载必须要在同一个作用域内重载,才叫做重载。在不同作用域的两个同名函数,并没有太大的关联。
函数重载容易与函数重写(override)混淆,比如派生类中有一个与基类同名的函数,并且函数名,返回值,参数列表均相同,但是这并不叫做重载,首先它们不在同一作用域,其次就算是重载参数列表也应该不同。所以这种派生类的行为称作对基类函数的重写(override)。

二、函数重载(function overload)
1、函数名和返回值相同,参数列不同的函数才能被重载。
2、C++是无法重载仅以返回值类型来区分的函数的。
3、但是在类中,const成员函数和非const成员函数是被看做同名函数的两个重载版本的。

三、运算符重载(operator overload)
运算符重载与函数重载书写格式基本一样只是把函数名换成 operator某某运算符而已。
但是要注意几个只能在类中重载的运算符:
1、下标运算符[]
2、函数调用运算符() 与函数对象有关
3、指针成员运算符->
4、复制运算符=

注意上面的运算符重载和函数重载都是编译时的多态(也叫做静态绑定,早绑定),即在程序编译时就确定好了的函数,编译时就可以确定之后的函数调用是使用的哪个函数。而运行时的多态主要是依靠类继承和虚函数来实现的。

四、函数的重写(override)
即在派生类当中对基类的虚函数进行了重新定义,执行不同的方法。
重写的要点:
1、返回值,函数名,参数都应该相同。
2、函数体类的定义不同
3、作用域不同,一个在基类,一个在派生类。
3、该函数必须是基类的virtual函数。(不是vrtual函数,那就是覆盖)。

五、类中的覆盖(hide)
派生类会继承(这里仅考虑public继承)基类的所有成员。如果一个函数在基类中有多个重载版本,但派生类重写了其中的一个重载版本,那么从基类继承而来的所有其他同名函数都将被覆盖,在派生类中只有这一个被重写的具备该名称的函数。
基类和派生类:

//in Base
class Base {
public:
	const int test_override()  {
		cout << 10 << endl;
		return 10;
	}
	static int test_override(int a, int b) {
		cout << a << b << endl;
	}
	int test_override(int a, int b, int c) {
		cout << a << b << c << endl;
	}
	virtual int test_override(int a) {
		cout << a  << endl;
		return a;
	}
};
//in Derived
class Derived :public Base{
public:
	/*other code*/
	int test_override() {
		cout << 10 << endl;
		return 10;
	}
};

此种情况,派生类重载的int test_override()函数将覆盖基类的所有同名版本(包括基类的虚函数)。
测试代码:

int main() {
	Derived d;
	d.test_override();//成功
	/*
	d.test_override(10);
	d.test_override(11,12);
	d.test_override(11,12,13);
	尝试调用上面的几个基类函数,编译器都将报错
	称函数调用中的参数太多。因此我们知道派生类的重载的
	int test_override()函数将所有基类同名的函数都覆盖了
	*/
	包括虚函数,static静态函数,普通成员函数
	return 0;
}

但如果,将派生类重写的函数原型改为和基类的虚函数一样,那么就相当于在派生类中重写了虚函数,修改了虚函数表,实现了多态。但是其他版本自基类继承而来的同名函数同样会被覆盖。(除非在派生类中再次声明定义)。

总结:只要派生类对基类的函数进行重写,就会覆盖掉自基类继承而来的其他所有同名函数,除非使用基类的作用域运算符,即Base::

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于C++ Overload、Override、hide的一些总结 的相关文章

随机推荐

  • oracle数据库的导入与导出

    文章目录 1 oracle数据库导入与导出需要注意2 导出数据格式介绍3 传统方式exp 导出 xff09 和 xff08 imp xff09 导入3 1 命令执行方式3 2 命令格式3 3 导出数据3 3 1示例 3 4 导入数据3 4
  • oarcle — ANY和ALL、行列转换、递归查询

    文章目录 1 在多行子查询中用ANY运算符1 1 示例 2 在多行子查询中用ALL运算符2 1 示例 3 行列转换3 1 建表3 2 插数3 3 列传行3 3 1 union all 实现列传行3 3 2 oracle 自带函数 3 4 行
  • 嵌入式学习规划

    一 STM32的单片机 1 学习stm32开发板 1 1 流水灯 学习内容 xff1a xff1a 工程建立 xff0c 库的使用 1 2 AD采集 学习内容 xff1a xff1a 学习AD 1 3 串口 学习内容 xff1a xff1a
  • UAV Ubuntu18.04 PX4环境搭建

    Ubuntu18 04 PX4环境搭建 设备 VMware WorkStation16 0pro Ubuntu18 04 虚拟机 参考链接 XTDrone团队的 xff1a 仿真平台基础配置 xff08 PX4 1 11版 xff09 ht
  • 无人机遥控器使用说明

    遥控器使用说明 21 06 09 激光雷达避障使用时候设置的通道 开机前检查 所有拨码开关拨到最上方 SWA SWB两个开关 暂时没用 主要使用SWC和SWD 开机 同时按下两个开机键开机 模式说明 现在使用的模式主要设置了四个 红框 SW
  • Jetson Tx2配置PX4飞控实机开发环境

    Jetson Tx2使用 设备 Jetson Tx2板卡 xff08 原装或者底板加核心板 xff09 带Ubuntu系统电脑或者虚拟机Tx2原装数据线HDMI显示器鼠标键盘 刷机 参考链接 1 使用NVIDIA SDK Manager刷机
  • Jetson Nano刷系统教程

    Jetson Nano使用 设备 Jetson Nano板卡64G SD卡 xff08 最小16G xff09 读卡器HDMI显示器鼠标键盘 刷机 格式化SD卡 使用SD卡格式化工具进行格式化 下载镜像 进入英伟达下载中心 xff1a ht
  • 【Windows下搭建深度学习环境之TensorFlow篇】一气呵成,五步搞定TensorFlow的安装!TensorFlow的安装之路

    TensorFlow的安装之路 0 安装前须知1 安装Anaconda1 1 什么是虚拟环境 xff1f 1 2 安装Anaconda具体步骤1 3 添加环境变量 xff08 系统变量 xff09 1 4 修改Conda库和pip库的安装源
  • 关于putty出现access denied的问题解决方案

    关于putty出现access denied的问题解决方案 1 网上也说了很多 比较多一点的就是修改PermitRootLogin 在linux终端terminal执行下面命令 sudo gedit etc ssh sshd config
  • [四旋翼无人机PID仿真(一)

    64 四旋翼无人机串级PID仿真 四旋翼无人机的数学模型的建立 xff1a 在建立模型的过程中 xff0c 采用了欧拉角来进行数学模型的建立 首先进行无人机结构以及飞行原理的分析 xff0c 然后进行系统建模 xff0c 在建模的过程中 x
  • Django查询、删除、更新数据

    查询数据 查询无疑是数据库表中使用频率最高的操作 table object get 方法用于从数据库表中取得一条匹配的结果 xff0c 返回一个对象 xff0c 如果记录不存在的话 xff0c 那么它会报DoesNotExist类型错误 通
  • static 静态方法可以直接调用,不用创建对象

    static 静态方法可以直接调用 xff0c 不用创建对象
  • Java歌手评分系统

    有五个评委 xff0c 对一个歌手唱歌打分 xff0c 最终得分要求去掉最高分去掉最低分 xff0c 求平均分 注意要求的格式为 xff1a 输入第1个评委给分 97 1 输入第2个评委给分 89 2 输入第3个评委给分 88 6 输入第4
  • python3环境下使用cv_bridge

    环境 ubuntu18 04 ros melodic 由于ros自带的python版本是2 7 系统中的cv bridge是用python2编译的 xff0c 如果在python3环境中使用cv bridge xff0c 会报以下错误 xf
  • 运行VINS-MONO报的错

    刚刚安装完环境 xff0c 已经可以跑通Euroc数据集 xff0c 回忆一下值得记下来的注意事项 环境配置 我的电脑 xff1a Ubuntu18 04 ROS melodic Opencv3 4 3 首先 xff1a GitHub上的代
  • TX2安装realsense SDK和librealsense

    官网https github com IntelRealSense librealsense安装很简单 xff0c 一定要对应好SDK与ros包 realsense固件的版本 https github com IntelRealSense
  • VINS-Fusion轨迹评估

    代码轨迹输出修改 visualization cpp VINS Fusion master vins estimator src utility visualization cpp的150行左右 xff1a span class token
  • antd4中Form组件initialValues设置初始值无效,使用setFieldsValue动态赋值,getFieldsValus动态获取值

    首先说明initialValues这个属性 xff0c 这个属性antd官方给的是设置Form组件初始值 xff0c 但是有个问题如果值从后端请求那么initialValues可能会设置不上 xff0c 如果说用匿名组件的话 xff0c 修
  • 一个存放论文、笔记等的github仓库

    link xff1a PaperNote如果好用 xff0c 请给个star哦
  • 关于C++ Overload、Override、hide的一些总结

    一 override和overload区别 当需要一些相同的函数名接受不同的参数实现不同的功能时 xff0c 可以是运用函数重载来实现 但是 xff0c 函数的重载必须要在同一个作用域内重载 xff0c 才叫做重载 在不同作用域的两个同名函