根据cppref:
Using-declaration 将基类的成员引入到派生类中 类定义,例如将基类的受保护成员公开为 派生的公共成员。
但是,下面的代码无法编译:
class A {
protected:
A(int, int) {
}
};
class B : public A {
public:
using A::A;
};
int main() {
B(1, 2); // error: calling a protected constructor of class 'A'
}
为什么 C++ using-declaration 不能按预期将基类的受保护成员公开为派生类的公共成员?
请注意同一页上有关 继承构造函数 的部分指出:
如果重载决策选择继承的构造函数,如果它在用于构造相应基类的对象时可访问,则它是可访问的:引入它的using声明的可访问性将被忽略。
(强调我的)
注意强调的部分“引入它的using声明的可访问性被忽略”。由于基类构造函数
A::A(int, int)
是 protected
,我们得到了上述错误。
从namespace.udecl也可以看到同样的情况:
using 声明具有成员声明的通常可访问性。 由于使用声明符而被认为是可访问的基类构造函数,如果它们在用于构造基类的对象时是可访问的; using 声明的可访问性被忽略。