Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么使用声明生成的构造函数具有与基类';相同的访问级别;?_C++_C++14 - Fatal编程技术网

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

C++ 为什么使用声明生成的构造函数具有与基类';相同的访问级别;?,c++,c++14,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; // [prot

用代码解释它更容易:

   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中尝试了该代码。我可以通过使用声明来更改成员函数的访问级别,但在构造函数上却不能这样做。我觉得很奇怪。有人知道为什么要设计成这样吗?

在这种情况下,构造函数不是生成的,而是继承的(实际上是从基类继承的)。
根据,继承构造函数时:

它与相应的基本构造函数具有相同的访问权限

访问指示的位置。
另一方面,对于成员方法:

使用声明将基类的成员引入派生类定义,例如将受保护的基类成员公开为派生类的公共成员

在这种情况下,可以显式更改访问权限


这就是为什么您可以使用声明更改成员函数的访问级别,而不能在构造函数上执行相同的操作。

我仍然不知道他们为什么要这样设计,但感谢您提供的信息。我的意思是,我仍然可以通过在派生类中所需的级别中定义构造函数来更改访问级别。保持继承构造函数与基的访问级别相同只会降低它的实用性。