c++中的Name Hiding(名称隐藏)是什么_c++继承作用域规则【详解】
发布时间 - 2026-01-08 00:00:00 点击率:次名称隐藏指派生类同名成员完全屏蔽基类同名成员,无论参数、访问权限或类型差异;需用using声明显式引入基类成员以支持重载或恢复可见性。
在 C++ 继承中,Name Hiding(名称隐藏)是指派生类中定义的名称(函数、变量、类型等)会**完全屏蔽**基类中同名的成员,即使参数列表不同、重载不匹配,甚至访问权限不同——只要名字相同,基类成员就不可见,除非显式指定作用域。
名称隐藏不是重载,而是“遮住”
很多人误以为派生类里加个同名函数就是重载,其实不是。C++ 的重载只发生在同一作用域内。而基类和派生类是不同作用域,所以派生类中出现同名成员时,编译器不会去基类里找其他重载版本,而是直接忽略整个基类作用域中的同名项。
- 哪怕基类有
void foo(int),派生类写了void foo(double),调用obj.foo(42)也会报错:找不到匹配的foo(int) - 哪怕基类函数是
public,派生类中只是声明了一个同名的private函数,基类版本依然被隐藏 - 变量、typedef、using 声明同样适用名称隐藏规则
如何让基类成员“重新可见”?用 using 声明
如果想在派生类中保留基类的同名成员(尤其是为了支持重载),必须用 using Base::name; 显式把基类名字引入派生类作用域。
-
using Base::func;会把Base中所有名为func的重载版本都带进来 - 之后你可以在派生类中新增重载,它们与基类版本共同参与重载解析
- 注意:
using只影响名称查找,不改变访问权限;若基类成员是private,using也无法让它变成可访问
构造函数、析构函数和 operator= 不自动继承,也不隐藏(但需注意)
C++11 起支持 using Base::Base; 继承构造函数,此时属于“继承”,不是“隐藏”。但默认情况下:
- 派生类不自动获得基类构造函数,也不隐藏它们(因为根本没声明)
- 派生类定义了自己的
operator=,会隐藏基类的赋值运算符;如需基类版本,也要用using Base::operator=; - 析构函数不会被隐藏,但派生类总会合成自己的析构函数,并自动调用基类析构——这是特殊规则,与名称查找无关
容易踩坑的典型场景
名称隐藏常在不经意间导致编译失败或行为异常:
- 基类有个
void print() const,派生类加了个void print()(非 const 版本)→ 基类 const 版本被隐藏,const obj.print()报错 - 模板基类中有个
value成员,派生类写了int value;→ 模板基类里的value(哪怕是静态成员或 typedef)全被隐藏 - 多重继承时,两个基类都有同名函数,派生类未重写也未
using→ 直接调用会歧义;若派生类自己定义了同名函数,则两个基类版本都被隐藏
基本上就这些。名称隐藏不是 bug,是 C++ 作用域设计的明确规则:派生类作用域优先,基类仅作“后备查找路径”,且一旦名字匹配就停止向上搜索。理解它,才能写出可预期的继承接口。
# c++
# 作用域
# typedef
# print
# 运算符
# 赋值运算符
# 构造函数
# 析构函数
# const
# int
# double
# void
# 类作用域
# 继承
# 接口
# using
# public
# private
# 多重继承
# operator
# bug
# 派生类
# 类中
# 自己的
# 也不
# 有个
# 访问权限
# 写了
# 报错
# 里加
# 这是
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用已有域名快速搭建网站?
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
使用Dockerfile构建java web环境
js实现获取鼠标当前的位置
JavaScript实现Fly Bird小游戏
Laravel如何使用Service Provider服务提供者_Laravel依赖注入与容器绑定【深度】
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
php485函数参数是什么意思_php485各参数详细说明【介绍】
zabbix利用python脚本发送报警邮件的方法
Laravel中的Facade(门面)到底是什么原理
什么是javascript作用域_全局和局部作用域有什么区别?
Laravel辅助函数有哪些_Laravel Helpers常用助手函数大全
Laravel怎么调用外部API_Laravel Http Client客户端使用
Laravel如何实现全文搜索_Laravel Scout集成Algolia或Meilisearch教程
javascript日期怎么处理_如何格式化输出
如何用搬瓦工VPS快速搭建个人网站?
java中使用zxing批量生成二维码立牌
矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?
Java遍历集合的三种方式
如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?
Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑
做企业网站制作流程,企业网站制作基本流程有哪些?
Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解
制作旅游网站html,怎样注册旅游网站?
昵图网官网入口 昵图网素材平台官方入口
免费视频制作网站,更新又快又好的免费电影网站?
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
Laravel如何处理和验证JSON类型的数据库字段
Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理
微信小程序 input输入框控件详解及实例(多种示例)
Laravel怎么清理缓存_Laravel optimize clear命令详解
javascript中对象的定义、使用以及对象和原型链操作小结
企业网站制作这些问题要关注
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
高性价比服务器租赁——企业级配置与24小时运维服务
Gemini手机端怎么发图片_Gemini手机端发图方法【步骤】
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Laravel怎么为数据库表字段添加索引以优化查询
javascript中的try catch异常捕获机制用法分析
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
高端企业智能建站程序:SEO优化与响应式模板定制开发
html文件怎么打开证书错误_https协议的html打开提示不安全【指南】
中山网站推广排名,中山信息港登录入口?
移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
PHP 500报错的快速解决方法
Laravel模型事件有哪些_Laravel Model Event生命周期详解
音响网站制作视频教程,隆霸音响官方网站?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?


以支持重载或恢复可见性。