为什么使用声明生成的构造函数具有与基类相同的访问级别'?

时间:2016-04-17 01:43:11

标签: c++ c++14

在代码中解释它更容易:

   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中的代码。我可以使用声明来更改成员函数的访问级别,而我在构造函数上也不能这样做。这对我来说很奇怪。有没有人知道他们为什么设计它的工作原理?

1 个答案:

答案 0 :(得分:0)

在这种情况下不会生成构造函数,而是继承它们(实际上是从基类) 根据{{​​3}},继承构造函数时:

  

它具有与相应基础构造函数

相同的访问权限

访问权限表示documentation 另一方面,对于成员方法:

  

Using-declaration将基类的成员引入派生类定义,例如将base的受保护成员公开为派生的公共成员。

在这种情况下,可以明确更改访问权限。

这就是你可以使用声明来改变成员函数的访问级别的原因,而你不能在构造函数上做同样的事情