不能。using声明仅恢复继承成员的名称可见性,不提升其访问级别;成员在派生类中的访问权限仍由其在基类中的原始权限和继承方式共同决定。

using 声明能提升继承成员的访问级别吗?
不能。用 using 声明无法把 private 或 protected 的基类成员变成 public(在派生类中),它只能让原本因访问控制而“不可见”的继承成员重新变得“可见”,且访问级别不高于其在基类中的原始级别。比如基类里是 protected,用 using Base::func; 在派生类中声明后,它在派生类中仍是 protected,外部仍不能直接调用。
为什么 using Base::func; 在 public 区域写却还是调用报错?
常见错误是只写了 using 声明,但没注意该成员在基类中的原始访问权限。例如:
class Base {
protected:
void foo() {}
};
class Derived : private Base {
public:
using Base::foo; // ✅ 这行合法,但 foo 在 Derived 中仍是 protected
};
Derived d;
d.foo(); // ❌ 编译错误:'foo' is inaccessible
这是因为 Base 是以 private 方式继承的,即使 using 把 foo 拉进 Derived 的作用域,它的访问级别仍受基类原始权限和继承方式双重约束。真正起作用的是:using 只改变“名称可见性”,不改变“访问控制语义”。
怎么让派生类用户能调用某个继承来的 protected 成员?
必须配合访问修饰符显式调整。有且仅有以下两种可行路径:
- 在派生类的
public区域中用using声明 —— 但前提是该成员在基类中本来就是public或protected,且继承方式允许暴露(如public或protected继承) - 更常用也更可控的方式:在派生类中写一个
public的包装函数,内部调用继承来的成员
示例:
class Base {
protected:
void bar() { /* ... */ }
};
class Derived : public Base {
public:
void bar_public() { bar(); } // ✅ 显式暴露
using Base::bar; // ⚠️ 无效:bar 在 Derived 中仍是 protected
};
此时只有 bar_public() 能被外部调用;using Base::bar; 不会改变 bar 的实际可访问性。
private 继承下 using 声明还有意义吗?
有意义,但仅限于派生类内部使用。比如你想在 Derived 的成员函数里调用基类的某个 protected 函数,又不想写 Base::func() 这样冗长的限定名,就可以用 using 简化作用域查找:
class Base {
protected:
int get_val() { return 42; }
};
class Derived : private Base {
public:
using Base::get_val; // 仅为了让 this->get_val() 可写
int compute() {
return get_val() * 2; // ✅ OK:在类内调用
}
};
这里 using 的唯一作用是省掉 Base:: 前缀,不增加任何外部可访问性。一旦离开 Derived 的成员函数,get_val 就不可见、也不可访问。
容易忽略的关键点:C++ 标准明确区分“名称查找”和“访问检查”两个阶段——using 只影响前者;后者由基类声明 + 继承方式 + 当前作用域三者共同决定。别指望靠一行 using 绕过访问控制。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











