基类的私有函数不会被派生类同名函数隐藏,因为private成员在名字查找阶段就被忽略,根本不可见;隐藏仅适用于派生类可访问的基类成员(如public/protected),前提是它们本可被查找到却被同名声明截断。

基类的私有函数不会被派生类同名函数隐藏。
因为私有成员根本不可见——不是“被隐藏”,而是“压根进不了名字查找范围”。
private 成员在继承中不参与名字查找
C++ 的名字查找(name lookup)发生在访问点(比如 d.func()),它只在可访问的作用域中进行。基类的 private 成员对派生类来说是不可访问的,编译器在查找 func 时,根本不会进入基类的私有区域,也就谈不上“是否被隐藏”。
- 派生类定义
void func()→ 不会影响基类private void func(),后者本来就不能被派生类调用 - 即使派生类没定义任何
func,它也无法通过this->func()或func()调用基类的私有版本 - 试图显式写
Base::func()也会失败,报错类似:error: 'func' is a private member of 'Base'
隐藏只发生在“可见但被屏蔽”的场景
名字隐藏的前提是:基类成员本可以被找到,但因派生类同名声明而被截断查找路径。典型例子是基类 public 或 protected 的函数:
class Base {
public:
void func() { /* ... */ }
protected:
void func(int) { /* ... */ }
private:
void func(double) { /* ... */ } // 这个从不参与查找
};
class Derived : public Base {
public:
void func(float) { /* ... */ } // 隐藏了 Base::func() 和 Base::func(int)
};
-
Base::func()和Base::func(int)被隐藏(因为它们可见,且同名) -
Base::func(double)完全不参与该查找过程(private → 查找阶段就被忽略)
容易踩的坑
- 误以为“只要同名就隐藏”,实际上隐藏只对派生类能看见的基类成员生效
- 在调试时发现某个函数“突然调不到了”,第一反应不该是“被隐藏了”,而应先确认:它是不是
private?有没有访问权限? - 把
private函数改成protected后行为突变,往往就是因为触发了名字隐藏而非预期的重载
private 成员的本质是“对外不可见”,不是“被覆盖或隐藏”——这个边界比很多人想的更硬。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











