C++知识积累:重载、隐藏和重写的区别

2023-11-03

1 重载

重载:是指同一可访问区内被声明的几个具有不同参数列(参数的类型,个数,顺序不同)的同名函数,根据参数列表确定调用哪个函数,重载不关心函数返回类型。

示例:

class A{
public:
  void test(int a);
  void test(double a);//重载
  void test(int a, double b);//重载
  void test(double a, int b);//重载
  int test(int a);         //错误,重载的返回类型必须相同
};

那么这里什么叫做不关心函数返回类型呢?如下所示:

#include <iostream>
using namespace std;

class A
{
public:
    A(){};
    ~A(){};
    int test(int a,int b) {return a+b; }
    char test(int a) {return '5'+a; }
};
int main()
{
    A *a=new A();
    cout << a->test(1) << endl;
    return 0;
}

这里调用一个参数的char test(int a)是完全可以的,但是如果重载函数为char test(int a,int b)的话,由于其参数列表与int test(int a,int b)相同,那么就会提示char test(int a,int b)不能被重载,可想而知,在我们调用test这个函数的时候,如果以test(a,b)去调用,那系统又怎么知道该调用int test(int a,int b)还是char test(int a,int b)呢?
由此我们也能看出,重载并非不能改变返回值类型,相反,只要合法,你可以随意改变返回值类型,不过不管你是否改变返回值类型,你的重载函数的参数列表是必须改变的,换句话说,重载函数即是在函数名相同的情况下改变参数列表,函数返回类型是否更改并无影响,这也就是为什么重载不关心函数返回类型了。

2 隐藏

隐藏:是指派生类的函数屏蔽了与其同名的基类函数,注意只要同名函数,不管参数列表是否相同,基类函数都会被隐藏。

示例:

#include <iostream>
using namespace std;

class Base
{
public:
    void test(int a,int b){ cout << "Base called!" << endl; }
};

class Derive : public Base
{
public:
    void test(int a){ cout << "Derive  called!" << endl; }
};

int main()
{
    Derive d;
    d.test(1);//   "Derive  called!" 调用子类的fun函数
    d.test(1, 1);//   错误,此时fun函数只能接收1个参数
    return 0;
}

也就是说,只要在子类中存在父类中的同名函数,那么通过子类对象是无法调用父类相应的同名函数,只能调用当前子类的同名函数。

3 重写(覆盖)

重写(覆盖):是指派生类中存在重新定义的函数。其函数名和参数列表都必须同基类中被重写的函数一致。只有函数体不同(花括号内),派生类调用时会调用派生类的重写函数,不会调用被重写函数。重写的基类中被重写的函数必须有virtual修饰。

示例:

#include<iostream>

using namespace std;

class Base
{
public:
    virtual void test(int a){ cout << "Base called !" << i << endl;}
};

class Derived : public Base
{
public:
    virtual void test(int a){ cout << "Derived  called! " << i << endl;}
};
int main()
{
    Base b;
    Base * pb = new Derived();
    pb->test(3); //   Derived  called!
    return 0;
}

总结一下:

不管是重载还是隐藏还是重写,相应情况下的两个函数的函数名都必须相同,在此前提下,三者的区别如下:

  • 重载函数与被重载函数必须在同一类中;隐藏函数与被隐藏函数、重写与被重写的函数是存在于父类与子类中;
  • 对于隐藏和重写,重写仅发生在父类函数有virtual修饰,且父子函数的参数列表完全相同,除此情况外无论父类函数是否有virtual修饰,都是隐藏。
  • 子类中一旦发生了隐藏或重写,则相应函数在父类中的所有重载函数都无法在子类中调用。
#include <iostream>

using namespace std;

class A
{
public:
    A(){};
    ~A(){};

    virtual int test(int a,int b)
    {
        cout<<"int A::test(int a,int b) called!"<<endl;
        return 0;
    }
    virtual char test(int a)
    {
        cout<<"char A::test(int a) called!"<<endl;
        return '0';
    }
};
class B:public A
{
public:
    B(){};
    ~B(){};

    int test(int a,int b,int c)     //隐藏
    {
        cout<<"int B::test(int a,int b,int c) called!"<<endl;
        return 0;
    }
    char test(int a)   //重写
    {
        cout<<"char B::test(int a) called!"<<endl;
        return '0';
    }
};

int main()
{
    B b;
    b.test(3,2,1);    //"int B::test(int a,int b,int c) called!"  调用B中的test隐藏函数
    b.test(1);    //"char B::test(int a) called!"   调用B中的test重写函数
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++知识积累:重载、隐藏和重写的区别 的相关文章

  • 【C/C++】报错问题积累

    1 出现Deprecated declaration XXX give arg types c文件中 有没有参数的函数时 声明需要加void即 main c void fun main h void fun void
  • fastcgi的环境变量

    FCGI ROLE RESPONDER SCRIPT FILENAME scripts 5 cgi QUERY STRING aaa 11111111111111 bbb 2222222222222222 ccc 3333333333333
  • 侯捷系列:c++面向对象高级编程(上)

    文章目录 基于对象的程序设计 不带有指针成员变量的类 以复数类 Complex 为例 头文件的结构 访问级别 函数设计 内联函数 构造函数 常量成员函数 参数的值传递和引用传递 返回值的值传递和引用传递 友元 操作符重载 在类内声明 pub
  • R语言学习笔记:分析学生的考试成绩

    孩子上初中时拿到过全年级一次考试所有科目的考试成绩表 正好可以用于R语言的统计分析学习 为了不泄漏孩子的姓名 就用学号代替了 感兴趣可以下载测试数据进行练习 num class chn math eng phy chem politics
  • 编写程序模拟完成动态分区存储管理方式的内存分配和回收。

    usr bin python coding utf 8 class Table object 空闲分区表 0 开始地址 1 长度 freeTable 占用分区表 0 程序名 1 开始地址 2 长度 useTable def init sel
  • JNA模拟复杂的C类型——Java映射char*、int*、float*、double*

    文章目录 引言 Java Native Type Conversions Java和C基本类型指针对应关系 Pointer的具体用法 引言 最近项目在用Java调用C写的一些三方库 没办法直接调 用Java封装一下C的接口 这就少不了要用到
  • C/C++中浮点数格式学习——以IEEE75432位单精度为例

    这是浮点数的通常表示形式 在IEEE754中 单精度浮点数有如下形式 32位单精度 单精度二进制小数 使用32个比特存储 1 8 23位长 S Exp Fraction 31 30至23偏正值 实际的指数大小 127 22至0位编号 从右边
  • 无法打开源文件<sys/time.h>,但是用time.h编译就会出错,缺少gettimeofday()

    因为sys time h是uinx系统下的库文件 而现在使用的平台是在windows 由于未指明程序运行的系统 导致找不到对应的头文件 需要重新实现gettimeofday 函数 define WIN32 include
  • 经典面试题之new和malloc的区别

    new和malloc的区别是C C 一道经典的面试题 我也遇到过几次 回答的都不是很好 今天特意整理了一下 0 属性 new delete是C 关键字 需要编译器支持 malloc free是库函数 需要头文件支持 1 参数 使用new操作
  • Lua和C++交互总结(很详细)

    出处 http blog csdn net shun fzll article details 39120965 一 lua堆栈 要理解lua和c 交互 首先要理解lua堆栈 简单来说 Lua和C c 语言通信的主要方法是一个无处不在的虚拟
  • vector,list,deque区别

    http blog csdn net renkaihao article details 6803866 vector和built in数组类似 它拥有一段连续的内存空间 并且起始地址不变 因此它能非常好的支持随即存取 即 操作符 但由于它
  • LeetCode题目笔记——17.19消失的两个数字

    文章目录 题目描述 题目难度 困难 方法一 暴力 代码 代码优化 方法二 数学方法 代码 总结 题目描述 题目直达 题目难度 困难 方法一 暴力 虽然题目说你能在 O N 时间内只用 O 1 的空间找到它们吗 但是也没有限制我们不能用暴力
  • 为何在新建STM工程中全局声明两个宏

    在uVision中新建STM32工程后 需要从STM32标准库中拷贝标准外设驱动到自己的工程目录中 此时需要在工程设置 gt C C 选项卡下的Define文本框中键入这两个全局宏定义 STM32F40 41xxx USE STDPERIP
  • Dev-C++之开启装逼效果

    Dev C 是个不错的C IDE 在10年前 它是很不错 在现在 它是个以界面丑陋和调试像吃粑粑这两点著称 如下图 实在是丑到离谱 丑到无法忍受 可是没办法呀 人家CCF规定比赛用这个 你个小蒟蒻吵什么 我现在就来讲讲怎么把你的Dev C
  • 虚函数不能声明为static

    虚函数申明为static报错 class Foo public Foo default static virtual Foo int main Foo foo return 0 main cpp 10 25 error member Foo
  • C 语言教程:数据类型和格式说明符

    C 语言中的数据类型 C 中的变量必须是指定的 数据类型 并且您必须在 printf 函数中使用 格式说明符 来显示它 创建变量 int myNum 5 整数 没有小数点 float myFloatNum 5 99 浮点数 char myL
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C 语言运算符详解

    C 语言中的运算符 运算符用于对变量和值进行操作 在下面的示例中 我们使用 运算符将两个值相加 int myNum 100 50 虽然 运算符通常用于将两个值相加 就像上面的示例一样 它还可以用于将变量和值相加 或者将变量和另一个变量相加
  • C++ 字符串比较------strcmp函数和strncmp函数

    strcmp 函数原型 int strcmp const char str1 const char str2 功能 strcmp函数会按照字典顺序逐个比较两个字符串的字符 直到遇到不同的字符或者遇到字符串结束符 0 返回值 该函数返回值如下
  • 在 OS X 上的 virtualenv 中安装 scrapy 加密时发生错误 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在安装 scrapypip in virtualenv on OS X 10 11 当它安装密码学时 它说 buil

随机推荐

  • Unix and perl primer for Biologists - Part1 :Unix - Learning the Essentials - Reading Notes(U13-U24)

    U13 Time to tidy up use the rmdir command this will only remove empty directories U14 The art of typing less to do more
  • 分页乱码问题(解决)

    上一个blog中 粗略的使用了下分页标签使用 pg使用问题还是有很多 如 分页中乱码 多java代码块下面用一个
  • CUDA Samples: Streams' usage

    以下CUDA sample是分别用C 和CUDA实现的流的使用code 并对其中使用到的CUDA函数进行了解说 code参考了 GPU高性能编程CUDA实战 一书的第十章 各个文件内容如下 funset cpp include funset
  • 关于示波器地线的问题!

    用信号发生器给板子输入信号 则示波器一般只能用于测试电路上某个节点和地之间的波形 如果测两个节点之间的波形 则探头上的地线可能会将地线后面其余的电路短路掉 所以 要想测两个节点间的波形 要合理的变换一下电路形式 或者做一些用于测试的附加电路
  • 以太坊的私钥、公钥、地址、账户之间的关系总结

    在以太坊中 账户 地址 私钥 Private Key 和公钥 Public Key 是非常重要的概念 账户扮演着以太坊的中心角色 地址是我们与以太坊系统进行交互的标识 它是以太坊账户与外界进行交互的名字 而私钥与公钥是保护我们账户安全的重要
  • 微搭低代码学习之数据展示

    低代码平台是一个快速发展的领域 未来有着广阔的发展前景 以下是一些低代码平台未来的发展方向 1 人工智能和机器学习 随着人工智能和机器学习技术的不断发展 低代码平台将能够更好地利用这些技术来提高应用程序的智能化和自动化水平 例如 低代码平台
  • 如何动态生成antd vue的menu组件

    目录 1 需求背景 2 解决方案 3 代码示例 1 需求背景 需要根据动态生成垂直菜单组件 数据来源的一级菜单可能包含二级子菜单 也可能不包含二级子菜单 难度在于是否包含二级子菜单决定着生成
  • 开源自动化测试平台介绍一览

    以下为小编整理的 各类自动化测试平台 供大家工作中自己参考 一 autotestplat 作者 fin 功能 接口自动化测试 性能测试 appui自动化测试 webui自动化测试 源码 https github com testdevhom
  • TensorRT Samples: MNIST API

    关于TensorRT的介绍可以参考 http blog csdn net fengbingchun article details 78469551 以下是参考TensorRT 2 1 2中的sampleMNISTAPI cpp文件改写的实
  • douyin【商品抢购js脚本】

    文章目录 前言 订阅须知 知识点 源码 前言 脚本主要用来实现抢购douyin商城 直播间秒杀商品等一系列商品 订阅须知 订阅后 只提供js源代码 不提供教学 请根据源码自行抓包 知识点 1 在查询串插入一个固定的键rstr 2 对查询串进
  • Java本地缓存技术选型

    常用的本地缓存 Guava Cache Guava Cache 是 Google 开发的一个 Java 本地缓存库 它提供了一些缓存特性 比如大小限制 自动过期 移除通知等等 Guava Cache 使用的是 LRU Least Recen
  • 如何和AI聊天

    AI产品工具目录 AI产品目录 Prompt 在和AI聊天时 你得表明你需要啥 并且描述的越精确 AI回答的就越贴近你的预期 简单的对话 可以自己尝试 但是如果想做应用级别的就得学习这种聊天技术 如何构建Prompt Prompt 是指用户
  • MySQL生产环境高可用架构实战

    分布式技术MongoDB 1 MySQL高可用集群介绍 1 1 数据库主从架构与分库分表 1 2 MySQL主从同步原理 2 动手搭建MySQL主从集群 2 1 基础环境搭建 2 2 安装MySQL服务 2 2 1 初始化MySQL 2 2
  • Linux Kjournald 进程高IO

    iotop查看各进程占用IO的情况 图片如下 发现 Kjournald IO占用过高 图片未保存 问题原因 由于 Kjournald 进程是ext3系统的日志进程 当ext3系统存在重大变更时 此进程会占高IO df h 查看设备 根据设备
  • 【数据结构】线段树笔记2

    数据结构 零基础线段树笔记1 参考和引用 线段树讲解 本博客主要是这个的笔记 线段树相关知识 线段树的结构 N的原数组 要4N的大小去存储线段树 原因 看线段树讲解吧 代码相关 更新当前节点 push up 是更新当前节点的操作 有两种写法
  • python——飞机大战小游戏

    目录 1 导入模块 2 窗口操作 3 事件操作 4 长按事件 5 添加游戏背景 6 添加英雄飞机 7 获取飞机的图片矩形 8 基本游戏窗口 9 添加游戏窗口图片 10 英雄飞机登场 11 英雄飞机装备子弹并发射 1 enemy plane
  • Pytest系列-数据驱动@pytest.mark.parametrize(7)

    简介 unittest 和 pytest参数化对比 pytest与unittest的一个重要区别就是参数化 unittest框架使用的第三方库ddt来参数化的 而pytest框架 前置 后置处理函数fixture 它有个参数params专门
  • Angular学习笔记68:Angular项目的单元测试 -- 对路由进行测试

    对路由进行测试 对于模版文件中有 的 在TestBed configureTestingModule 的元数据的imports数据一定要加上 RouterTestingModule 属于嵌套到组件中的其他组件 并不是单元测试的重点 第一种处
  • 人工智能知识全面讲解: RBF神经网络

    7 4 1 全连接与局部连接 1968 年 生 物 学 家 休 伯 尔 David Hunter Hubel 教 授 与 维 泽 尔 Torsten N Wiesel 教授在研究动物如何处理视觉信息时有一个重要的发 现 他们发现动物大脑皮层
  • C++知识积累:重载、隐藏和重写的区别

    1 重载 重载 是指同一可访问区内被声明的几个具有不同参数列 参数的类型 个数 顺序不同 的同名函数 根据参数列表确定调用哪个函数 重载不关心函数返回类型 示例 class A public void test int a void tes