0

0

c++中的Name Hiding(名称隐藏)是什么_c++继承作用域规则【详解】

尼克

尼克

发布时间:2026-01-08 18:59:02

|

617人浏览过

|

来源于php中文网

原创

名称隐藏指派生类同名成员完全屏蔽基类同名成员,无论参数、访问权限或类型差异;需用using声明显式引入基类成员以支持重载或恢复可见性。

c++中的name hiding(名称隐藏)是什么_c++继承作用域规则【详解】

在 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 只影响名称查找,不改变访问权限;若基类成员是 privateusing 也无法让它变成可访问

构造函数、析构函数和 operator= 不自动继承,也不隐藏(但需注意)

C++11 起支持 using Base::Base; 继承构造函数,此时属于“继承”,不是“隐藏”。但默认情况下:

PodLM
PodLM

PodLM是一款强大的AI播客生成工具

下载

立即学习C++免费学习笔记(深入)”;

  • 派生类不自动获得基类构造函数,也不隐藏它们(因为根本没声明)
  • 派生类定义了自己的 operator=,会隐藏基类的赋值运算符;如需基类版本,也要用 using Base::operator=;
  • 析构函数不会被隐藏,但派生类总会合成自己的析构函数,并自动调用基类析构——这是特殊规则,与名称查找无关

容易踩坑的典型场景

名称隐藏常在不经意间导致编译失败或行为异常:

  • 基类有个 void print() const,派生类加了个 void print()(非 const 版本)→ 基类 const 版本被隐藏,const obj.print() 报错
  • 模板基类中有个 value 成员,派生类写了 int value; → 模板基类里的 value(哪怕是静态成员或 typedef)全被隐藏
  • 多重继承时,两个基类都有同名函数,派生类未重写也未 using → 直接调用会歧义;若派生类自己定义了同名函数,则两个基类版本都被隐藏

基本上就这些。名称隐藏不是 bug,是 C++ 作用域设计的明确规则:派生类作用域优先,基类仅作“后备查找路径”,且一旦名字匹配就停止向上搜索。理解它,才能写出可预期的继承接口。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

184

2023.09.27

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

227

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

520

2023.09.20

typedef和define区别
typedef和define区别

typedef和define区别在类型检查、作用范围、可读性、错误处理和内存占用等。本专题为大家提供typedef和define相关的文章、下载、课程内容,供大家免费下载体验。

107

2023.09.26

c语言typedef的用法
c语言typedef的用法

c语言typedef的用法有定义基本类型别名、定义结构体别名、定义指针类型别名、定义枚举类型别名、定义数组类型别名等。本专题为大家提供typedef相关的文章、下载、课程内容,供大家免费下载体验。

96

2023.09.26

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

315

2023.08.02

Golang 分布式缓存与高可用架构
Golang 分布式缓存与高可用架构

本专题系统讲解 Golang 在分布式缓存与高可用系统中的应用,涵盖缓存设计原理、Redis/Etcd集成、数据一致性与过期策略、分布式锁、缓存穿透/雪崩/击穿解决方案,以及高可用架构设计。通过实战案例,帮助开发者掌握 如何使用 Go 构建稳定、高性能的分布式缓存系统,提升大型系统的响应速度与可靠性。

59

2026.01.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 6.3万人学习

C 教程
C 教程

共75课时 | 3.9万人学习

C++教程
C++教程

共115课时 | 11.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号