【C++】多态 ⑥ ( 函数重定义涉及的问题 - 子类覆盖父类函数名 )

news2024/9/28 1:19:36

文章目录

  • 一、函数重定义涉及的问题
    • 1、执行出错的代码
    • 2、代码分析
    • 3、错误原因分析 - 函数重定义问题 : 子类覆盖父类函数名
    • 4、正确调用函数的方法





一、函数重定义涉及的问题




1、执行出错的代码


错误代码示例 :

#include "iostream"
using namespace std;

// 父类
class Parent {
public:
	void fun(int a, int b, int c)
	{
		cout << "执行 父类 void fun(int a, int b, int c) 函数" << endl;
	}

	void fun(int a, int b)
	{
		cout << "执行 父类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
		cout << "执行 父类 void fun(int a) 函数" << endl;
	}
};

// 子类
class Child : public Parent {
public:
	void fun(int a, int b)
	{
		cout << "执行 子类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
		cout << "执行 子类 void fun(int a) 函数" << endl;
	}
};


int main() {

	Child c;
	c.fun(1, 2, 3);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

报错信息 :

已启动生成…
1>------ 已启动生成: 项目: HelloWorld, 配置: Debug Win32 ------
1>Test.cpp
1>D:\002_Project\006_Visual_Studio\HelloWorld\HelloWorld\Test.cpp(41,15): error C2661: “Child::fun”: 没有重载函数接受 3 个参数
1>已完成生成项目“HelloWorld.vcxproj”的操作 - 失败。
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========

在这里插入图片描述


2、代码分析


在 Parent 父类 中 , 定义了如下 3 个函数 ,

	void fun(int a, int b, int c)
	void fun(int a, int b)
	void fun(int a)

在 Child 子类中 , 重定义了上述 3 个函数中的 2 个函数 ,

	void fun(int a, int b)
	void fun(int a)

注意 : 是重定义 , 不是重写 ; 重写 需要 为 父类 函数添加 virtual 关键字修饰 , 会有多态效果 ;

重定义 时 , 子类 会 覆盖 父类 的 函数名称 ;


执行

	Child c;
	c.fun(1, 2, 3);

代码 , 尝试调用 父类的 3 个参数的 fun 函数 , 出现错误 ,

报错 : error C2661: “Child::fun”: 没有重载函数接受 3 个参数 ;


该错误是编译阶段报的错误 , 编译根本通不过 ;


3、错误原因分析 - 函数重定义问题 : 子类覆盖父类函数名


错误原因分析 : 函数重定义 带来的问题 , 子类覆盖父类函数名 ;

函数重定义的函数名称覆盖问题 : C++ 编译器 发现 Child c 对象要调用 void fun(int a, int b, int c) 函数 , 子类中已经存在 fun 函数了 , 子类 会 覆盖 父类的函数名 , C++ 编译器只会在 子类查找 该函数 , 不会去父类 查找 ;

子类查找函数 : C++ 编译器 在 子类中找到了 void fun(int a, int b) 和 void fun(int a) 两个函数 , 没有找到 3 个参数的函数 , 此时 C++ 编译器会报错 :

error C2661: “Child::fun”: 没有重载函数接受 3 个参数 ; 

4、正确调用函数的方法


在这种情况下 , 由于子类 重定义了部分 父类的重载函数 , 导致 父类的 函数名被覆盖 , 此时需要使用 域操作符 访问父类 被覆盖的函数 ;

	Child c;
	c.Parent::fun(1, 2, 3);

代码示例 :

#include "iostream"
using namespace std;

// 父类
class Parent {
public:
	void fun(int a, int b, int c)
	{
		cout << "执行 父类 void fun(int a, int b, int c) 函数" << endl;
	}

	void fun(int a, int b)
	{
		cout << "执行 父类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
		cout << "执行 父类 void fun(int a) 函数" << endl;
	}
};

// 子类
class Child : public Parent {
public:
	void fun(int a, int b)
	{
		cout << "执行 子类 void fun(int a, int b) 函数" << endl;
	}

	void fun(int a)
	{
		cout << "执行 子类 void fun(int a) 函数" << endl;
	}
};


int main() {

	Child c;
	c.Parent::fun(1, 2, 3);

	// 控制台暂停 , 按任意键继续向后执行
	system("pause");

	return 0;
}

执行结果 :

执行 父类 void fun(int a, int b, int c) 函数
Press any key to continue . . .

在这里插入图片描述

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

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

相关文章

Openssl数据安全传输平台014:OCCI环境搭建和使用:Centos8-Oracle19c代码跑通 + Window代码没跑通(不影响本项目)

文章目录 0 代码仓库1 启动Centos oracle数据库2 Winsows安装配置OCCI库2.1 下载文件2.2 VS 配置2.2.1 VC包含目录2.2.2 VC库目录2.2.3 连接器-附加依赖项2.2.4 代码测试-Oracle11g2.2.4.1 准备2.2.4.2 代码测试 3 Centos安装配置occi库3.0 强调3.1 下载instantclient库文件压缩…

国产思仪 1765A/B/C/D/E程控直流电源

1765A/B/C/D/E程控直流电源 产品综述 1765系列程控直流电源主要用于储能设备系统的测量分析和自动测试系统的加电测试。作为一种双象限直流电源&#xff0c;将电源输出和功率吸收的功能完全集成到单一系统中&#xff0c;可实现电源与负载功能的无缝转换&#xff0c;解决双向能源…

RT-Thread 内存管理(一)

内存管理 在计算系统中&#xff0c;通常存储空间可以分为两种&#xff1a;内部存储空间和外部存储空间。 内部存储空间通常访问速度比较快&#xff0c;能够按照变量地址随机访问&#xff0c;也就是我们通常所说的RAM&#xff08;随机访问存储器&#xff09;&#xff0c;可以把…

Linux gzip命令:压缩文件或目录

gzip 是 Linux 系统中经常用来对文件进行压缩和解压缩的命令&#xff0c;通过此命令压缩得到的新文件&#xff0c;其扩展名通常标记为“.gz”。 再强调一下&#xff0c;gzip 命令只能用来压缩文件&#xff0c;不能压缩目录&#xff0c;即便指定了目录&#xff0c;也只能压缩目录…

使用WebDav服务远程操作本地服务器?试试群晖NAS【内网穿透】

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 1. 在群晖套件中心安装WebDav Server套件1.1 安装完成后&#xff0c;启动webdav服务&#xff0c;并勾选HTTP复选…

Linux 文件系统简介

文章目录 一、磁盘简介1.1 简介1.2 机械硬盘与固态硬盘1.2.1 机械磁盘&#xff08;HDD&#xff09;1.2.2 固态磁盘&#xff08;SSD&#xff09;1.2.3 I/O操作 二、文件系统简介2.1. 简介2.2 文件系统特点2.3 Linux文件系统 三、文件数据存储方式3.1 连续存储3.2 链接表存储3.3 …

Ansible中常用模块

目录 一、Ansible实现管理的方式 二、Ad-Hoc执行方式中如何获得帮助 三、Ansible命令运行方式及常用参数 四、Ansible的基本颜色代表信 五、Ansible中的常用模块 1、command模块 2、shell模块、script模块 3、copy模块、fetch模块 4、file模块 5、archive模块、unarc…

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取

FPGA_Signal TapII 逻辑分析仪 在线信号波形抓取 由于一些工程的仿真文件不易产生&#xff0c;所以我们可以利用 quartus 软件自带的 SignalTap 工具对波形进行抓取 对各个信号进行分析处理&#xff0c;让电子器件与FPGA进行正常通讯工作&#xff0c;也验证所绘制的波形图是否一…

Spring面试题:(一)IoC,DI,AOP和BeanFactory,ApplicationContext

IoC&#xff0c;DI&#xff0c;AOP思想 IOC就是控制反转&#xff0c;是指创建对象的控制权的转移。以前创建对象的主动权和时机是由自己把控的&#xff0c;而现在这种权力转移到Spring容器中&#xff0c;并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。对象与对…

NSSCTF做题第十页(1)

[GXYCTF 2019]禁止套娃 看源代码也没什么东西&#xff0c;扫一下看看 发现了git泄露 话不多说直接开整 下载下来了 flag.php 还是代码审计 <?php include "flag.php"; echo "flag在哪里呢&#xff1f;<br>"; if(isset($_GET[exp])){ if (!preg_…

怎么看电脑有几个cpu?还有cpu是几核的?

一、怎么查看电脑有几个cpu 电脑CPU是电脑的核心&#xff0c;CPU是中央处理器&#xff0c;是电脑进行线程调度的关键&#xff0c;可以通过查看电脑CPU性能个数可以判定一个电脑的性能。今天小编介绍下如何查看电脑CPU个数。 简单的方式直接查看CPU个数。启动电脑后&#xff0c;…

喜讯!合合信息顺利通过CMMI3级评估

近日&#xff0c;在擎标顾问团的咨询辅导下&#xff0c;上海合合信息科技股份有限公司&#xff08;简称“合合信息”&#xff09;顺利通过了CMMI3级评估。CMMI是国际上最流行、最实用的一种软件生产过程标准和软件企业成熟度等级认证的标准&#xff0c;通过该认证表明企业在开发…

Cesium笔记(0):Cesium简介和本地运行

一、Cesium介绍 是国外一个基于JavaScript编写的使用WebGL的地图引擎开源程序&#xff0c;可以免费用于商业和非商业 二、特点 支持3D,2D,2.5D形式的地图展示可以自行绘制图形&#xff0c;高亮区域&#xff0c;并提供良好的触摸支持支持绝大多数的浏览器和mobile动态地理空间…

【Python百练——第2练】使用Python做一个猜数字小游戏

&#x1f490;作者&#xff1a;insist-- &#x1f490;个人主页&#xff1a;insist-- 的个人主页 理想主义的花&#xff0c;最终会盛开在浪漫主义的土壤里&#xff0c;我们的热情永远不会熄灭&#xff0c;在现实平凡中&#xff0c;我们终将上岸&#xff0c;阳光万里 ❤️欢迎点…

洛谷 B2009 计算 (a+b)/c 的值 C++代码

目录 题目描述 AC Code 切记 题目描述 题目网址&#xff1a;计算 (ab)/c 的值 - 洛谷 AC Code #include<bits/stdc.h> using namespace std; int main() {int a,b,c;cin>>a>>b>>c;cout<<(ab)/c<<endl;return 0; } 切记 不要复制题…

实战之巧用header头

案例&#xff1a; 遇到过三次 一次是更改accept&#xff0c;获取到tomcat的绝对路径&#xff0c;结合其他漏洞获取到shell。 一次是更改accept&#xff0c;越权获取到管理员的MD5加密&#xff0c;最后接管超管权限。 一次是更改accept&#xff0c;结合参数获取到key。 这里以越…

vscode免密码认证ssh连接virtual box虚拟机

文章目录 安装软件virtual box配置vscode配置创建并传递密钥连接虚拟机最后 安装软件 安装vscode和virtual box&#xff0c;直接官网下载对应软件包&#xff0c;下载之后&#xff0c;点击执行&#xff0c;最后傻瓜式下一步安装即可 virtual box配置 创建一个仅主机网络的网卡 …

【Linux】第七站:vim的使用以及配置

文章目录 一、vim1.vim的介绍2.vim基本使用3.vim的命令模式常用命令4.底行模式 二、vim的配置 一、vim 1.vim的介绍 vim编辑器&#xff0c;用来文本编写&#xff0c;可以写代码 它是一个多模式的编辑器 它有很多的模&#xff0c;不过我们暂时先只考虑这三种模式 命令模式插入模…

Java基础知识之反射机制详解

一、什么是反射机制? 反射机制是指在运行时动态地获取类的信息,并能够通过这些信息对类的对象进行操作。Java中的反射机制包括获取类信息、获取成员信息、创建对象、调用方法等操作。通过反射机制,我们可以在运行时动态地了解类的结构、属性和方法等信息,从而实现对类的动态…

JavaScript简介:探索Web开发中的魔力

目录 历史与发展 特点与优势 特点与功能 简单易学 客户端脚本语言 跨平台与兼容性 应用领域 总结 JavaScript是一种高级的、解释型的编程语言&#xff0c;用于在网页上实现交互和动态效果。它广泛应用于前端开发中&#xff0c;是构建现代Web应用的核心技术之一。JavaScrip…