在代码中解释它更容易:
class A {
protected:
A(int i) {}
void foo() {}
};
class B : public A {
public:
B() : A(0) {}
using A::A;
using A::foo;
};
int main()
{
B b1;
// [protected] A::foo => [public] B::foo
b1.foo(); // Ok
// [protected] A::A(int) => [protected] B::B(int)
B b2(0); // cannot access protected member
}
我尝试了VS2015中的代码。我可以使用声明来更改成员函数的访问级别,而我在构造函数上也不能这样做。这对我来说很奇怪。有没有人知道他们为什么设计它的工作原理?
答案 0 :(得分:0)
在这种情况下不会生成构造函数,而是继承它们(实际上是从基类) 根据{{3}},继承构造函数时:
它具有与相应基础构造函数
相同的访问权限
访问权限表示documentation 另一方面,对于成员方法:
Using-declaration将基类的成员引入派生类定义,例如将base的受保护成员公开为派生的公共成员。
在这种情况下,可以明确更改访问权限。
这就是你可以使用声明来改变成员函数的访问级别的原因,而你不能在构造函数上做同样的事情。