理解cpp的重载,重写,重定义

2023-11-18

函数重载(overload)

函数重载是指在一个类中声明多个名称相同但参数列表不同的函数,这些的参数可能个数或顺序,类型不同,但是不能靠返回类型来判断。特征是:
(1)相同的范围(在同一个作用域中);
(2)函数名字相同;
(3)参数不同;
(4)virtual 关键字可有可无(注:函数重载与有无virtual修饰无关);
(5)返回值可以不同;

函数重写(也称为覆盖 override)

函数重写是指子类重新定义基类的虚函数。特征是:
(1)不在同一个作用域(分别位于派生类与基类);
(2)函数名字相同;
(3)参数相同;
(4)基类函数必须有 virtual 关键字,不能有 static 。
(5)返回值相同,否则报错;
(6)重写函数的访问修饰符可以不同;

重定义(也称隐藏)

(1)不在同一个作用域(分别位于派生类与基类) ;
(2)函数名字相同;
(3)返回值可以不同;
(4)参数不同。此时,不论有无 virtual 关键字,基类的函数将被隐藏(注意别与重载以及覆盖混淆);
(5)参数相同,但是基类函数没有 virtual关键字。此时,基类的函数被隐藏(注意别与覆盖混淆);

在这里插入图片描述

//
//  main.cpp
//  TestOveride
//
//  Created by New_Life on 2017/4/26.
//  Copyright © 2017年 chenhuan001. All rights reserved.
//

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;

class A {
public:
    void overload_print(int a) {// 1
        cout << "overload A: a" << endl;
    }
    
    void overload_print(int a, int b) {// 2,重载1
        cout << "overload A: a , b" << endl;
    }
    
    /*  编译错误,不能出现重载
     *  Functions that differ only in their return type cannot be overloaded
     *  overload_print(1) 的时候,谁知道你调用的什么。
    int overload_print(int a) {
        return 1;
    }
    */
    
    /*  编译错误,static 与 virtual 定义冲突
     *  虚函数只能出现在no-static中
     *  'virtual' can only appear on non-static member functions
    static virtual void virtual_print() {
        cout << "virtual A: " << endl;
    }
     */
    
    void redefine_print() {//3
        cout << "redefine A: " << endl;
    }
    
    // -------------- Test hidden ----------------//
    void hidden_print() {
        cout  << "hidden A:" << endl;
    }
    
    void hidden_print(int a) {
        cout  << "hidden A: a" << endl;
    }
    
private:
    virtual void override_print() {// 4
        cout << "override A: " << endl;
    }
    
    void redefine_print(int a) {// 5
        cout << "redefine priavte A: a" << endl;
    }
};

class B : public A {
public:
    void override_print() { //重写(覆盖)了4, private -> public,其实可以看出是一个新的。
        cout << "override B: " << endl;
    }

    void redefine_print() {//重定义 3
        cout << "redefine B: " << endl;
    }
    
    void redefine_print(int a) {//重定义 5, 说明父类为private的函数也能重定义,也可以看出一个新的。
        cout << "redefine B: a" << endl;
    }
    
    // ------------- Test hidden -----------------//
    void hidden_print(int a, int b) {
        cout  << "hidden B: a, b" << endl;
    }
};

int main(int argc, const char * argv[]) {
    B b;
    b.overload_print(1, 2); //打印 重载
    
    b.override_print();     //打印 重写
    
    b.redefine_print();     //打印重定义
    b.redefine_print(1);    //打印重定义,private
    
    /* 编译错误,因为这两个父类的函数,因为同名被隐藏了。使用b.A::hidden_print(), b.A::hidden_print(1)即可
     * Too few arguments to function call, expected 2, have 0; did you mean 'A::hidden_print'?
    b.hidden_print();
    b.hidden_print(1);
     */
    b.hidden_print(1, 2);
    return 0;
}

reference

关于C++中static以及virtual的理解

牛客:对C++中重载(overload)和重写(override)

C++中,friend、static、virtual为什么不能同时用

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

理解cpp的重载,重写,重定义 的相关文章

  • 从 Makefile 中的 C++FLAGS 中删除一个标志?

    我有一个 Makefile 其中包含另一个设置了很多默认值的 makefile 我无法编辑包含的 makefile 并且我想更改 makefile 中 C FLAGS 的值 即使它是在包含的 makefile 中设置的 具体来说 每当 de
  • 使用 C#.net 中的私有存储库的身份验证读取 BitBucket API

    我已经尝试了几天让 BitBucket API 为我工作 但是当涉及到让它为具有身份验证的私有存储库工作时 将问题设置为私有 当它们设置为公开 无需身份验证 一切正常 代码示例如下 static void Main string args
  • 如何从对Web服务发出的请求中获取客户端IP地址

    我的 IIS 中托管有一个 Web 服务 当客户端直接使用我的服务时 我需要找出客户端 IP 地址 like http MyIpAddress MyApplication MyWebServiceClass asmx http MyIpAd
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • 为基于架构的 XML 文件创建 WPF 编辑器

    这是场景 我们的服务器产品之一使用大型 XML 配置文件 该文件的布局相当好 并且针对 XSD 文件进行了验证 现在是时候构建一个配置 GUI 来维护这个文件了 我想深入研究 WPF 来完成它 我可以为每个配置部分布置一个单独的表单 每次向
  • 这种对有效类型规则的使用是否严格遵守?

    C99和C11中的有效类型规则规定 没有声明类型的存储可以用任何类型写入 并且存储非字符类型的值将相应地设置存储的有效类型 抛开 INT MAX 可能小于 123456789 的事实不谈 以下代码对有效类型规则的使用是否严格符合 inclu
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 仅针对某些异常类型中断

    我知道异常处理是一件非常重要的事情 我们在所有项目中都在这样做 主要原因是记录客户发生的错误 这工作正常 根本不是问题 但是 当我仍在使用 Visual Studio 编码和运行应用程序时 我根本不需要任何异常处理 我希望调试器正好停在应用
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 使用正则表达式解析日志文件

    我目前正在为我们的内部日志文件 由 log4php log4net 和 log4j 生成 开发一个解析器 到目前为止 我有一个很好的正则表达式来解析日志 除了一个烦人的一点 一些日志消息跨越多行 我无法正确匹配 我现在的正则表达式是这样的
  • 如何修复此 YCrCb -> RBG 转换公式?

    我使用的公式来自这个问题 https stackoverflow com questions 8838481 kcvpixelformattype 420ypcbcr8biplanarfullrange frame to uiimage c
  • 在关键服务器上对字符串进行内存受限的外部排序,并合并和计算重复项(数十亿个文件名)

    我们的服务器生成如下文件 c521c143 2a23 42ef 89d1 557915e2323a sign xml在其日志文件夹中 第一部分是GUID 第二部分是名称模板 我想计算具有同名模板的文件的数量 例如 我们有 c521c143
  • 公共基类打破了元组的空基类优化

    gcc 4 7 1 对元组进行空基类优化 我认为这是一个非常有用的功能 然而 这似乎有一个意想不到的限制 include
  • 如何检查给定调用站点的重载决策集

    如何检查重载解析集 我在多个调用站点中使用了 4 个相互竞争的函数 在一个调用站点中 我期望调用一个函数 但编译器会选择另一个函数 我不知道为什么 这不是微不足道的 为了了解发生了什么 我正在使用enable if disable if打开
  • VS C# 中的依赖地狱,找不到依赖项

    我创建了一个图表 C 库 我们称之为chartlibrary 它本身依赖于多个第三方 dll 文件 在另一个可执行项目中 我们称之为chartuser 我参考了chartlibrary项目 两个项目位于 Visual Studio 中的同一
  • 多个包含带有变量定义的头文件

    我只是构建一个简单的 C 项目 代码如下所示 head h ifndef HEAD H define HEAD H int my var 100 endif src1 cpp include head h src2 cpp include
  • 为什么将未使用的返回值转换为 void?

    int fn void whatever void fn 是否有任何理由将未使用的返回值强制转换为 void 或者我认为这完全是浪费时间 David s answer https stackoverflow com questions 68
  • C# XML 反序列化。将节点中的所有内部文本读取到字符串属性中

    我目前正在尝试修改我的类 以便我的模型上的文本属性包含某个节点的所有内部文本 text node 给我带来问题的 xml 示例是
  • 为什么 getch 不可移植?

    是什么使得 getch 本质上无法作为标准 C 函数包含在内 对于控制台界面来说 它是如此直观和优雅 如果没有它 要求输入单个字符总是会产生误导 因为用户可以输入多个键 更糟糕的是 您经常需要确保在读取控制台输入后清除标准输入 这甚至不是作
  • 如何在c#中获取斐波那契数

    伙计们 我有一个关于斐波那契的问题 如何获得斐波那契数列 该数字也将以用户输入结束 例如 如果我输入 21 则输出必须为 0 1 1 2 3 5 8 13 21 这是我的代码 static void Main string args int

随机推荐

  • 【python】numpy.percentile()函数

    numpy percentile 1 函数 百分位数是统计中使用的度量 表示小于这个值的观察值的百分比 函数numpy percentile 接受以下参数 np percentile a q axis None out None overw
  • android布局矩形只显示一条底线,android – 在布局的绝对中心显示一个矩形框

    您可以使用重量使用线性布局进行调整 我已经粘贴了一个示例代码 希望这会有所帮助 android layout width fill parent android layout height fill parent android orien
  • 【Linux】遍历文件夹

    include
  • 关于图像模式识别的几种分类方法概述

    1 基于概率统计的Bayes分类器 因为在实际分类中由于考虑的侧重点不同或者关心的点不一样导致不能使用同一决策去解决所有的事件的分类 所以需要根据不同的准测函数选择不同的分类决策 基于最小错误率的Bayes决策 基于最小风险的Bayes决策
  • mybatis 分页_Mybatis 分页查询方法

    Mybatis自带的两种分页方法 Mybatis有两种自带分页方法 RowBounds和PageHelper 其中前者是逻辑分页 后者是物理分页 本文后续假设使用myabtis generator生成mapper RowBounds Row
  • 二阶段无法解决的问题

    二阶段无法解决的问题 协调者再发出commit消息之后宕机 而唯一接收到这条消息的参与者同时也宕机了 那么即使协调者通过选举协议产生了新的协调者 这条事务的状态也是不确定的 没人知道事务是否被已经提交 与两阶段提交不同的是 三阶段提交有两个
  • python - 快速搜索指定格式文件的方法

    需求1 快速查找指定文件夹下 所有满足开头为NC 结尾为 nc的文件 root path Users xpji convert kuihua9data 20230621 from pathlib import Path def get fi
  • ES6中Null判断运算符(??)正确打开方式-

    读取对象属性的时候 如果某个属性的值是null或者undefined 有时候需要为它们指定默认值 常见的作法是通过 运算符指定默认值 const headerText response settings headerText Hello w
  • C语言:指针(进阶)

    目录 指针 指针概念 a 什么是地址 b 什么是指针 指针变量 a 指针变量是用来做什么的 b 指针变量的类型怎么理解 和 操作符 a 单目操作符 是什么 b 单目操作符 是什么 二级指针 a 二级指针是什么 指针类型的意义 a 为什么指针
  • iOS 报错:没有查看权限the file "xxx.app" couldn't be opened because you don't have permission to view it.

    iOS the file xxx app couldn t be opened because you don t have permission to view it 问题解决方法汇总 1 最近重构项目 增加target来区分环境进行差异
  • order by排序的用法

    一 order by 1 其实1表示第一个栏位 2表示第二栏位 依此类推 当表中只有2个栏位时 oder by 3就会出错 这个跟order by 列名没有什么区别 不过在特殊情况下还是很有用的 select owner table nam
  • windows vs2010 下使用glib库 mono4.3

    开发工具 vs2010 1 下载glib http ftp gnome org pub gnome binaries win32 glib 中有各个版本的glib列表 选一个感兴趣的 本文使用2 12 glib 2 12 11 zip gl
  • OKR与CFR管理模式(一)-什么是OKR?

    前言 无论任何管理书籍 都是围绕着人性 如何激发员工的人性中的自尊和自我价值观 自我成就感 作为一名领导者 在管理面前 必须要是冷静 安静的对待他人 好主意 再加上 卓越的执行 就一定可以创造奇迹 而这正是OKR 目标与关键结果 Objec
  • 常见面试问题 - 2(计算机网络)

    OSI七层模型 TCP IP四层模型 五层协议 OSI七层模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 TCP IP四层模型 应用层 传输层 网络层 网络接口层 五层体系结构 应用层 传输层 段 网络层 包 数据链路层
  • glint360k数据集的解压

    关于训练集的解压早就有人写了blog了 文章地址 https blog csdn net weixin 43408232 article details 109687884 但是对于它剩余的7个bin文件我很困惑 根据他们在官方的微博上声明
  • Verilog学习(3)initial,always,task,function,常见系统任务

    结构说明语句 Verilog中任何过程模块都属于以下四种结构的说明语句 initial说明语句 always 说明语句 task说明语句 function说明语句 一个程序模块可以有多个initial和always 过程块 每个initia
  • 常用的windows命令大全

    当我们熟练掌握windows命令时 可以通过输入命令来快速完成各种系统操作 非常的便捷 那么常用的windows命令有哪些呢 今天 小编就把命令介绍给大家 windows命令 1 gpedit msc 组策略 2 sndrec32 录音机
  • 12-JavaScript的正则表达式 DAY9 (04.20)

    1 正则表达式的定义 正则表达式是由一个字符序列形成的搜索模式 用来匹配 当在文本中搜索数据时 可以使用搜索模式来描述查询内容 其可以是一个简单的字符 或者一个更复杂的模式 2 正则表达式的创建 1 字面量 var reg1 abc g g
  • 论人工智能历史、现状与未来发展战略

    来源 学术前沿 作者 郭毅可 人工智能问世60多年来 承载着人类对自己的智慧的无限自信 在这样的自信下 人工智能发展到了今天 人们在追求机器从事尽可能多的智力劳动的路上走得很快 也很远 今天人工智能的发展 实际上标志着人类第三次认知革命 即
  • 理解cpp的重载,重写,重定义

    函数重载 overload 函数重载是指在一个类中声明多个名称相同但参数列表不同的函数 这些的参数可能个数或顺序 类型不同 但是不能靠返回类型来判断 特征是 1 相同的范围 在同一个作用域中 2 函数名字相同 3 参数不同 4 virtua