为什么 C++ using-declaration 不能将基类的受保护成员公开为派生类的公共成员?

问题描述 投票:0回答:1

根据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 不能按预期将基类的受保护成员公开为派生类的公共成员?

c++ c++11 inheritance standards using-declaration
1个回答
1
投票

请注意同一页上有关 继承构造函数 的部分指出:

如果重载决策选择继承的构造函数,如果它在用于构造相应基类的对象时可访问,则它是可访问的:引入它的using声明的可访问性将被忽略。

(强调我的)

注意强调的部分“引入它的using声明的可访问性被忽略”。由于基类构造函数

A::A(int, int)
protected
,我们得到了上述错误。


namespace.udecl也可以看到同样的情况:

using 声明具有成员声明的通常可访问性。 由于使用声明符而被认为是可访问的基类构造函数,如果它们在用于构造基类的对象时是可访问的; using 声明的可访问性被忽略。

© www.soinside.com 2019 - 2024. All rights reserved.