C++ 重载、覆盖、隐藏

2023-11-18

C++ 重载、覆盖、隐藏

 

重载、覆盖和隐藏是C++中容易混淆的概念,作为C++研发人员有必要了解其区别和实现,以下结合概念和源码加以说明。

 

1、重载

重载指同一个类或者范围内,被声明的同名函数其参数数量或者类型不同,使用时根据函数参数列表确定调用哪个函数,需要注意的是重载不关注函数返回类型。

其特点:1)相同范围,2)函数名称相同,3)参数不同(类型或数量),4)virtual可有可无

代码:

#include <iostream>
using namespace std;
class A
{
public:
	void fun(){	cout<<"(void)"<<endl;}
	int fun(int a){ cout<<"(int)a:"<<a<<endl;}
	void fun(const char *str){cout<<"(char*)str:"<<str<<endl;}
	//int fun(int b){ cout<<"(int)b"<<b<<endl;}//报错,重载不关注返回类型
};
int main(int argc, char const *argv[])
{
	A a;
	a.fun();
	a.fun(1);
	a.fun("string");
	return 0;
}
/* 输出:
(void)
(int)a:1
(char*)str:string
*/

 

2、覆盖

覆盖/重写指派生类的成员函数覆盖基类中同名函数,即当在子类中定义了一个与父类完全相同的虚函数时,则称子类的这个函数重写(也称覆盖)了父类的这个虚函数。

特点:1)基类中被重写的函数必须为虚函数,2)重写在不同范围(基类和派生类),3)函数名和对应参数必须相同。

代码:

#include <iostream>
using namespace std;
class A
{
public:
	virtual void fun1(){cout<<"A fun1"<<endl;}
	virtual void fun2(){cout<<"A fun2"<<endl;}
	void fun3(){cout<<"A fun3"<<endl;}
};
class B:public A
{
public:
	void fun1(){cout<<"B fun1"<<endl;}
	void fun3(){cout<<"B fun3"<<endl;}
};
class C:public B
{
public:
	void fun2(){cout<<"C fun2"<<endl;}	
};

int main(int argc, char const *argv[])
{
	A *pA = new C;
	pA->fun1();
	pA->fun2();
	pA->fun3();
	B *pB = new C;
	pB->fun1();
	pB->fun2();
	pB->fun3();
	return 0;
}
/* 输出:
B fun1 //继承B的fun1,B重写A的fun1
C fun2 //重写B的fun2
A fun3 
B fun1 
C fun2 //重写B的fun2
B fun3 
*/

 

3、隐藏

隐藏/重定义指派生类函数屏蔽基类中的同名函数,函数名称相同,不能构成覆盖的都视作为隐藏。

特点:1)如果派生类的函数与基类的函数同名,并且参数也相同,但是基类函数没有virtual关键字,此时基类的函数被隐藏;2)如果派生类的函数与基类的函数同名,但是参数不同,此时,不论有无virtual关键字,基类的函数将被隐藏。

代码:

#include <iostream>
using namespace std;
class A
{
public:
	void fun(int x){cout<<x<<endl;}
};
class B1:public A
{
public:
	void fun(const char *x){cout<<x<<endl;}
	//void fun(int x); has been hided
};
class B2:public A
{
public:
	void fun(const char *x){cout<<x<<endl;}
	void fun(int x){A::fun(x);}
};

class A1
{
public:
	virtual fun(int x){cout<<x<<endl;}
};
class C:public A1
{
public:
	void fun(const char *x){cout<<x<<endl;}//此处隐藏导致fun(int)无法访问
};
int main(int argc, char const *argv[])
{
	B1 *pB1 = new B1;
	pB1->fun("Hello B1");
	//pB1->fun(1);//error: invalid conversion from 'int' to 'const char*'
	B2 *pB2 = new B2;
	pB2->fun("Hello B2");
	pB2->fun(22);
	
	C *pC = new C;
	pC->fun("Hello C");
	//pC->fun(33);//error: invalid conversion from 'int' to 'const char*'
	return 0;
}
/* 输出
Hello B1
Hello B2
22 //由于隐藏B1/2不能调用fun(int),可通过在B2中重载使用该函数
Hello C
*/

 

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

C++ 重载、覆盖、隐藏 的相关文章

  • C++ 中的软(不是:弱)引用 - 这可能吗?有实施吗?

    在 C 中我正在使用boost shared ptr and boost weak ptr自动删除不再需要的对象 我知道这些与引用计数一起工作 在 Java 中 内存由垃圾收集器管理 它将内置对象引用视为strong WeakReferen
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 获取两个字符串之间的公共部分c# [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要的是获取两个单词之间的共同部分并获取差异 例子 场景1 word1 感言 word2 Test 将返回 公共部分Test 不同之
  • 在 OpenCL 中将函数作为参数传递

    是否可以在 OpenCL 1 2 中将函数指针传递给内核 我知道可以用C实现 但不知道如何在OpenCL的C中实现 编辑 我想做这篇文章中描述的同样的事情 在 C 中如何将函数作为参数传递 https stackoverflow com q
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • Guid 应包含 32 位数字和 4 个破折号

    我有一个包含 createuserwizard 控件的网站 创建帐户后 验证电子邮件及其验证 URL 将发送到用户的电子邮件地址 但是 当我进行测试运行时 单击电子邮件中的 URL 时 会出现以下错误 Guid should contain
  • TextBox 焦点的 WinForms 事件?

    我想添加一个偶数TextBox当它有焦点时 我知道我可以用一个简单的方法来做到这一点textbox1 Focus并检查布尔值 但我不想那样做 我想这样做 this tGID Focus new System EventHandler thi
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • 通过不同 DLL 或 EXE 中的指针或引用访问 STL 对象时发生访问冲突

    我在使用旧版 VC6 时遇到以下问题 我只是无法切换到现代编译器 因为我正在处理遗留代码库 http support microsoft com kb 172396 http support microsoft com kb 172396
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 我应该在应用程序退出之前运行 Dispose 吗?

    我应该在应用程序退出之前运行 Dispose 吗 例如 我创建了许多对象 其中一些对象具有事件订阅 var myObject new MyClass myObject OnEvent OnEventHandle 例如 在我的工作中 我应该使
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • Swagger 为 ASP.CORE 3 中的字典生成错误的 URL

    当从查询字符串中提取的模型将字典作为其属性之一时 Swagger 会生成不正确的 URL 如何告诉 Swagger 更改 URL 中字典的格式或手动定义输入参数模式而不自动生成 尝试使用 Swashbuckle 和 NSwag 控制器 pu
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 实现SSM简易商城项目的登录注册功能

    实现SSM简易商城项目的登录注册功能 项目背景介绍 在互联网时代 电商行业蓬勃发展 越来越多的人开始关注电子商务 为了实现一个简易商城项目 我们选择了SSM框架作为项目的基础架构 SSM分别代表了Spring SpringMVC和MyBat
  • 睿智的目标检测24——Keras搭建Mobilenet-SSD目标检测平台

    睿智的目标检测24 Keras搭建Mobilenet SSD目标检测平台 更新说明 学习前言 什么是SSD目标检测算法 源码下载 SSD实现思路 一 预测部分 1 主干网络介绍 2 从特征获取预测结果 3 预测结果的解码 4 在原图上进行绘
  • 【编译部署】使用Visual Studio编译Linux平台程序/动态库(远程连接)

    文章目录 1 背景 2 使用的环境 3 配置步骤 3 1 安装 Visual Studio 工具集 3 2 创建解决方案 3 3 Linux 端准备工作 3 4 测试编译和运行 5 添加附加包含和附加库 1 背景 由于日常在 Windows
  • 论文笔记:Hankel Matrix Factorization for Tagged Time Series to Recover Missing Values during Blackouts

    ICDE 2019 0 摘要 在执行时间序列分析时 恢复时间序列中的缺失值至关重要 而本文研究的blackouts问题 即在一定时期内丢失所有数据 是最紧迫和最具挑战性的问题之一 现有的时间序列缺失值恢复方法无法正确处理这个问题 但在这项工
  • 数组和指针笔试题解析之【数组】

    目录 前言 1 一维数组 2 字符数组 2 1题型一 2 2题型二 2 3题型三 3 二维数组 前言 1 数组名的意义 sizeof 数组名 这里的数组名表示整个数组 计算的是整个数组的大小 单位是字节 数组名 这里的数组名表示整个数组 取
  • win10连接蓝牙耳机_蓝牙耳机兼容性是什么?哪个牌子蓝牙耳机连接稳定续航高_...

    2020年10月21日 10 08 作者 网络 编辑 王动 不论我们何时走在街上 总能看到有人佩戴着耳机摇头晃脑 似乎沉浸在音乐的世界里无法自拔 但在众多手机去掉的耳机接口后 大多数人开始将目光投向蓝牙耳机 希望能够重获快乐 只是 并非所有
  • pyltp的本地安装

    0 电脑配置 win 8 1 64位操作系统 python 2 7 1 使用pip安装pyltp 运行安装命令 pip install pyltp 第一次失败 缺少Visual C 9 0 参考资料 https blog csdn net
  • Android,页面3秒自东跳转和点击跳转显示

    先打开ADT程序创建 创建文件 如图 命名为Day01 注意大小写 注意改名字不要重复 在res layout中找到 下面第一个是视图 第二个是对视图进行编辑点击第二个进行编辑 把
  • 多线程面试总结

    总结 每个对象有一个监视器锁monitor 线程进入同步方法时尝试获取monitor的所有权 其他线程进入阻塞状态 该线程释放monitor的所有权后其他线程重新尝试获取monitor的所有权 只能有一个线程对同步监视器加锁 1 多线程的问
  • React报错误及其解决方案

    1 Import in body of module reorder to top import first 解决方案 import开头代码写在最前面
  • 微信支付之扫码支付相关代码(Java)(转载)

    最近开发网站过程 需要引入支付过程 第三方支付中最火的莫过于支付宝支付和微信支付 下边借助微信支付官网上的文档 写一下接入微信支付之扫码支付的流程 相对支付宝支付而言 微信支付的开发文档写的相当的low demo写的一点都不简洁 下边写一下
  • 如何创建http端口监听_比Minikube更快,使用Kind快速创建K8S学习环境

    简述 K8S 如火如荼的发展着 越来越多人想学习和了解 K8S 但是由于 K8S 的入门曲线较高很多人望而却步 然而随着 K8S 生态的蓬勃发展 社区也呈现了越来越多的部署方案 光针对生产可用的环境就有好几种部署方案 对于用来测试和学习环境
  • PHP秒杀系统 高并发 高性能的极致挑战 下载

    第1章 课程介绍 秒杀系统在各种网站和应用中经常会用到 本课程从基本的系统设计和基础功能开始教导大家用PHP来设计和实现秒杀系统 并且为海量并发提供更高级的技术方案和实现手段 第2章 系统技术选型分析 本章节需要大家掌握基础的LNMP平台的
  • RAC Failover三种方式

    1 Client Side Connect Time Failover 1 1 在用户端tnsname中配置了多个地址 用户发起连接请求时 会先尝试连接地址表中的第一个地址 如果这个连接尝试失败 则继续尝试使用第二个地址 直至连接成功或者遍
  • CSAPP——2.2整数表示

    两种整数 1 非负数 unsigned 2 负数 0 正数 T 补码 B 二进制 U 无符号数 1 整数数据类型 unsigned char short int long int32 t int64 t 2 无符号数的编码 假设位向量 x
  • 【Unity】2D太空登录小游戏开发入门教程(下)

    Unity 是一款非常流行且用途广泛的游戏引擎 拥有一长串受支持的平台和设备 3D 游戏可能是您谈到 Unity 时的第一个想法 该引擎甚至曾经被称为Unity 3D 但是 大部分移动 主机和桌面游戏都是以 2D 形式呈现的 因此了解 Un
  • 考研政治——选择题判断原则

    博主个人感觉政治的选择题答案真的不用背诵 而且付出与收获完全是绝对失衡的 大家做选择题时如果明确知道答案最好 但若不确定 这里博主分享一些个人总结的做题经验或可以说是筛选原则 练习时单选题尽量不要错 多选题保持在7个以内 文章目录 马原 毛
  • Inno Setup 系列之安装、卸载时调用bat

    需求 想在安装的时候调用install bat 在卸载的时候调用uninstall bat 解决 可以这样写 Inno Setup 的脚本 Setup NOTE The value of AppId uniquely identifies
  • Java中的OOP

    OOP Object Oriented Programming 是面向对象编程 OOP特征分别是封装 继承 多态 1 封装 保护内部的操作不被破坏 2 继承 在原本的基础之上继续进行扩充 3 多态 在一个指定的范围之内进行概念的转换 Jav
  • C++ 重载、覆盖、隐藏

    C 重载 覆盖 隐藏 重载 覆盖和隐藏是C 中容易混淆的概念 作为C 研发人员有必要了解其区别和实现 以下结合概念和源码加以说明 1 重载 重载指同一个类或者范围内 被声明的同名函数其参数数量或者类型不同 使用时根据函数参数列表确定调用哪个