C++ 重载(Overload)、重写(Override)、隐藏(Hiding) 的区别

news2025/6/4 2:56:31

C++ 重载(Overload)、重写(Override)、隐藏(Hiding) 的区别

这三个概念是 C++ 面向对象的核心知识点,也是面试必问内容。下面我们从定义、发生条件、代码示例、底层原理全方位解析它们的区别。

一、核心区别对比表(速记版)

特性重载(Overload)重写(Override)隐藏(Hiding)
作用域同一作用域父子类继承关系父子类继承关系
函数名相同相同相同
参数列表必须不同必须相同可以相同或不同
virtual不需要必须基类有virtual不需要
返回值可不同必须相同(协变除外)可不同
多态性编译时决定运行时多态编译时决定

二、重载(Overload) - 同一作用域的函数变体

定义

同一作用域内,函数名相同但参数列表不同(类型、顺序、数量)

关键代码示例

class Calculator {
public:
    // 重载示例
    int add(int a, int b) { return a + b; }
    double add(double a, double b) { return a + b; }
    int add(int a, int b, int c) { return a + b + c; }
};

核心特点

  1. 必须在同一作用域(如同一个类中)
  2. 返回值类型可不同(但仅返回值不同不构成重载!)
  3. 调用时编译器根据参数类型决定调用哪个版本
  4. 典型应用:构造函数重载、运算符重载

三、重写(Override) - 多态性的核心实现

定义

继承体系中,派生类重新定义基类virtual 函数,实现运行时多态

关键代码示例

class Animal {
public:
    virtual void speak() { cout << "Animal sound" << endl; } // 虚函数
};

class Dog : public Animal {
public:
    void speak() override { cout << "Wang Wang!" << endl; } // 重写
};

Animal* animal = new Dog();
animal->speak(); // 输出 "Wang Wang!"(多态调用)

核心特点

  1. 必须通过基类指针/引用调用才能体现多态
  2. 函数签名必须完全相同(C++11可用override关键字检查)
  3. 特殊情况:协变返回类型(允许返回派生类指针/引用)
    class Base {
    public:
        virtual Base* clone() { return new Base(); }
    };
    class Derived : public Base {
    public:
        Derived* clone() override { return new Derived(); } // 合法协变
    };
    

四、隐藏(Hiding) - 最容易踩坑的隐藏规则

定义

当派生类定义了与基类同名函数(无论参数是否相同),隐藏基类的同名函数。

关键代码示例

class Base {
public:
    void func() { cout << "Base::func()" << endl; }
    void func(int) { cout << "Base::func(int)" << endl; }
};

class Derived : public Base {
public:
    void func() { cout << "Derived::func()" << endl; } // 隐藏基类所有func版本
};

Derived d;
d.func();    // 正确,调用Derived::func()
// d.func(1); // 编译错误!基类func(int)被隐藏

核心特点

  1. 隐藏所有基类同名函数(包括重载版本)
  2. 可通过using声明恢复可见性:
    class Derived : public Base {
    public:
        using Base::func; // 恢复基类func的所有重载
        void func() { cout << "Derived::func()" << endl; }
    };
    
  3. 与重写的区别:不需要virtual不构成多态

五、对比案例分析

案例1:重载 vs 重写

class A {
public:
    virtual void foo(int) { cout << "A::foo(int)" << endl; }
    void bar(int) { cout << "A::bar(int)" << endl; }
};

class B : public A {
public:
    void foo(int) override { cout << "B::foo(int)" << endl; } // 重写
    void bar(double) { cout << "B::bar(double)" << endl; }    // 隐藏(非重载!)
};

B b;
A* pa = &b;
pa->foo(1);   // B::foo(int) (多态)
pa->bar(1);   // A::bar(int) (无多态)
b.bar(1.0);   // B::bar(double)
// b.bar(1);   // 编译警告,隐式转换,仍然调用B::bar(double)

案例2:隐藏的陷阱

class Base {
public:
    void print(int x) { cout << "Base: " << x << endl; }
};

class Derived : public Base {
public:
    void print(string s) { cout << "Derived: " << s << endl; } // 隐藏基类print(int)
};

Derived d;
d.print("hello"); // Derived: hello
// d.print(42);   // 编译错误!基类print(int)被隐藏
d.Base::print(42); // 正确,显式指定作用域

六、面试高频问题

Q1:如何强制检查是否正确重写?

✅ C++11 使用 override 关键字:

class Child : public Parent {
    void foo() override; // 如果Parent没有virtual foo(),编译报错
};

Q2:重载能否跨作用域?

❌ 不能!派生类定义同名函数会隐藏基类重载版本(除非使用using

Q3:虚函数能否重载?

✅ 可以!但重写时必须签名完全匹配(协变返回除外)

Q4:如何区分重写和隐藏?

✅ 看两点:

  1. 基类是否有virtual关键字
  2. 是否通过基类指针/引用调用表现出多态

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

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

相关文章

李臻20242817_安全文件传输系统项目报告_第14周

安全文件传输系统项目报告&#xff08;第 14 周&#xff09; 1. 代码链接 Gitee 仓库地址&#xff1a;https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明&#xff1a; SecureFileTransfer/ ├── client/ # 客户端主目…

20250531MATLAB三维绘图

MATLAB三维绘图 三维曲线&#xff1a;plot3功能介绍代码实现过程plot3实现效果 三维曲面空间曲面作图命令&#xff1a;meshmeshgrid语法示例应用meshgrid实操训练 peakspeaks 的基本用法peaks数学表达式实操训练自定义网格大小使用自定义网格 meshMATLAB代码对齐快捷键Ctrli墨西…

深入理解C#异步编程:原理、实践与最佳方案

在现代软件开发中&#xff0c;应用程序的性能和响应能力至关重要。特别是在处理I/O密集型操作&#xff08;如网络请求、文件读写、数据库查询&#xff09;时&#xff0c;传统的同步编程方式会导致线程阻塞&#xff0c;降低程序的吞吐量。C# 的异步编程模型&#xff08;async/aw…

基于千帆大模型的AI体检报告解读系统实战:使用OSS与PDFBox实现PDF内容识别

目录 说明 前言 需求 流程说明 表结构说明 整体流程 百度智能云 注册和实名认证 创建应用 费用说明 大模型API说明 集成大模型 设计Prompt 上传体检报告 读取PDF内容 功能实现 智能评测 抽取大模型工具 功能实现 总结 说明 AI体检报告解读、病例小结或者…

Spring,SpringMVC,SpringBoot

1.Spring最核心包括aop和ioc概念 AOP 能够将将哪些于业务无关的&#xff0c;并且大量重复的业务逻辑进行封装起来&#xff0c;便于减少重复代码&#xff0c;降低模块之间的耦合度&#xff0c;给未来的系统更好的可用性和可维护性。 Spring中AOP是采用动态代理&#xff0c;JDK代…

数据分析学习笔记——A/B测试

目录 前言 A/B测试中的统计学方法 假设检验 Levenes Test莱文测试 t 检验&#xff08;两组均值差异&#xff09; 实战案例 数据来源及参考资料 代码详解 导入数据 计算ROI Request检验 GMV检验 ROI检验 结语 前言 什么是A/B测试&#xff1f;说白了就是中学生物实…

基于RK3568/RK3588/全志H3/飞腾芯片/音视频通话程序/语音对讲/视频对讲/实时性好/极低延迟

一、前言说明 近期收到几个需求都是做音视频通话&#xff0c;很多人会选择用webrtc的方案&#xff0c;这个当然是个不错的方案&#xff0c;但是依赖的东西太多&#xff0c;而且相关组件代码量很大&#xff0c;开发难度大。所以最终选择自己属性的方案&#xff0c;那就是推流拉…

解决 Win11 睡眠后黑屏无法唤醒的问题

目录 一、问题描述二、解决方法1. 禁用快速启动2. 设置 Management Engine Interface3. 允许混合睡眠其他命令 4. 修复系统文件5. 更新 Windows 或驱动程序6. 其他1&#xff09;更改电源选项2&#xff09;刷新 Hiberfil.sys 文件3&#xff09;重置电源计划4&#xff09;运行系统…

[ElasticSearch] RestAPI

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Linux中的shell脚本

什么是shell脚本 shell脚本是文本的一种shell脚本是可以运行的文本shell脚本的内容是由逻辑和数据组成shell脚本是解释型语言 用file命令可以查看文件是否是一个脚本文件 file filename 脚本书写规范 注释 单行注释 使用#号来进行单行注释 多行注释 使用 : " 注释内容…

dvwa3——CSRF

LOW&#xff1a; 先尝试change一组密码&#xff1a;123456 修改成功&#xff0c;我们观察上面的url代码 http://localhost/DVWA/vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange# 将password_new部分与password_conf部分改成我们想要的…

【学习笔记】Transformer

学习的博客&#xff08;在此致谢&#xff09;&#xff1a; 初识CV - Transformer模型详解&#xff08;图解最完整版&#xff09; 1 整体结构 Transformer由Encoder和Decoder组成&#xff0c;分别包含6个block。 Transformer的工作流程大体如下&#xff1a; 获取每个单词的em…

欢乐熊大话蓝牙知识12:用 BLE 打造家庭 IoT 网络的三种方式

🏠 用 BLE 打造家庭 IoT 网络的三种方式 不止是“蓝牙耳机”,BLE 还能把你家“点亮成精”! 👋 前言:BLE 不只是蓝牙耳机的“代名词” 蓝牙?很多人一听就联想到“耳机连接失败请重试”。但你知道吗?现在 BLE(Bluetooth Low Energy)在智能家居中已经偷偷搞起了大事情。…

02.上帝之心算法用GPU计算提速50倍

本文介绍了上帝之心的算法及其Python实现&#xff0c;使用Python语言的性能分析工具测算性能瓶颈&#xff0c;将算法最耗时的部分重构至CUDA C语言在纯GPU上运行&#xff0c;利用GPU核心更多并行更快的优势显著提高算法运算速度&#xff0c;实现了结果不变的情况下将耗时缩短五…

MES管理系统:Java+Vue,含源码与文档,实现生产过程实时监控、调度与优化,提升制造企业效能

前言&#xff1a; 在当今竞争激烈的制造业环境中&#xff0c;企业面临着提高生产效率、降低成本、提升产品质量以及快速响应市场变化等多重挑战。MES管理系统作为连接企业上层计划管理系统与底层工业控制之间的桥梁&#xff0c;扮演着至关重要的角色。它能够实时收集、分析和处…

LeetCode算法题 (搜索二维矩阵)Day18!!!C/C++

https://leetcode.cn/problems/search-a-2d-matrix/description/ 一、题目分析 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 ta…

VectorStore 组件深入学习与检索方法

考虑到目前市面上的向量数据库众多&#xff0c;每个数据库的操作方式也无统一标准&#xff0c;但是仍然存在着一些公共特征&#xff0c;LangChain 基于这些通用的特征封装了 VectorStore 基类&#xff0c;在这个基类下&#xff0c;可以将方法划分成 6 种&#xff1a; 相似性搜…

HackMyVM-First

信息搜集 主机发现 ┌──(kali㉿kali)-[~] └─$ nmap -sn 192.168.43.0/24 Starting Nmap 7.95 ( https://nmap.org ) at 2025-05-31 06:13 EDT Nmap scan report for 192.168.43.1 Host is up (0.0080s latency). MAC Address: C6:45:66:05:91:88 (Unknown) …

跨平台浏览器集成库JxBrowser 支持 Chrome 扩展程序,高效赋能 Java 桌面应用

JxBrowser 是 TeamDev 开发的跨平台库&#xff0c;用于在 Java 应用程序中集成 Chromium 浏览器。它支持 HTML5、CSS3、JavaScript 等&#xff0c;具备硬件加速渲染、双向 Java 与 JavaScript 连接、丰富的事件监听等功能&#xff0c;能处理网页保存、打印等操作&#xff0c;助…

WEBSTORM前端 —— 第3章:移动 Web —— 第3节:移动适配

目录 一、移动Web基础 1.谷歌模拟器 2.屏幕分辨率 3.视口 4.二倍图 二、适配方案 三、rem 适配方案 四、less 1.less – 简介 2.less – 注释 3.less – 运算 4.less – 嵌套 5.less – 变量 6.less – 导入 7.less – 导出 8.less – 禁止导出 五…