派生类同名函数会屏蔽基类所有同名函数,因为C++名称查找在派生类作用域中找到同名符号即停止,不继续搜索基类,无论参数是否匹配、是否为虚函数;访问被隐藏的基类成员必须显式使用作用域解析符::。

直接调用派生类对象的同名方法时,总是调用派生类版本,无论参数是否相同、基类函数是否为虚函数——这是作用域查找规则决定的静态绑定行为,不是“重载”也不是“多态”。
为什么派生类同名函数会屏蔽基类所有同名函数
基类和派生类是两个独立作用域,C++ 名称查找从派生类作用域开始,一旦找到同名符号(哪怕参数不匹配),就停止向上查找。这意味着:
-
Base::show()和Derived::show(int)同名 →Derived中的show隐藏整个Base::show族,包括无参版本 - 即使
Base::func(double)是虚函数,Derived::func(int)仍会隐藏它,不会触发重载解析 - 这种隐藏与访问权限无关:
public、protected成员都会被遮蔽
如何安全调用被隐藏的基类函数
必须显式使用作用域解析符 ::,且只能在派生类内部或通过派生类对象语法调用:
- 在派生类成员函数中:
Base::func(); - 在外部代码中:
obj.Base::func();(obj是派生类对象) - 不能写
obj.func();期望自动选基类版本——编译器不会回退查找 - 若基类函数是虚函数且签名完全一致,用基类指针调用才能触发动态绑定,但那属于覆盖(override),不是隐藏场景
虚函数 + 同名同参 ≠ 自动覆盖,需满足严格条件
只有同时满足以下四点,才会构成有效覆盖(override),从而支持多态调用:
立即学习“C++免费学习笔记(深入)”;
- 基类函数声明为
virtual - 派生类函数与基类函数
函数名、参数列表、const修饰完全一致 - 返回类型相同,或满足协变(如基类返回
Base*,派生类返回Derived*) - 派生类函数未加
final,基类函数未加override冲突标记
漏掉任一条件(比如少个 const 或返回类型不协变),编译器可能静默转为隐藏,而不是报错——这是最易被忽略的坑。


















