Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.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++ - Fatal编程技术网

C++ 使用语句和受保护构造函数

C++ 使用语句和受保护构造函数,c++,C++,此代码不编译。。。即使在结构B公共部分中使用A::A,B仍然没有接受int的公共构造函数(但它有一个受保护的构造函数) 似乎: 我可以通过“使用”继承公共构造函数 我可以在派生类中将基类(private或protected或else)中定义的任何方法重新声明为public 但我不能对构造函数做同样的事情:无法通过“使用”改变其可见性 为什么?这是故意的。请注意,A::A继承每个构造函数,而不仅仅是您期望的构造函数。使用的访问修饰符对每个继承的构造函数应用,可能影响太大。相反,它只是使它们可用于重

此代码不编译。。。即使在结构B公共部分中使用A::A,B仍然没有接受int的公共构造函数(但它有一个受保护的构造函数)

似乎:

我可以通过“使用”继承公共构造函数

我可以在派生类中将基类(private或protected或else)中定义的任何方法重新声明为public

但我不能对构造函数做同样的事情:无法通过“使用”改变其可见性


为什么?这是故意的。请注意,
A::A
继承每个构造函数,而不仅仅是您期望的构造函数。使用的访问修饰符对每个继承的构造函数应用
,可能影响太大。相反,它只是使它们可用于重载解析

发件人:

如果using声明引用所定义类的直接基的构造函数(例如,
using base::base;
),则在初始化派生类时,该基的所有构造函数(忽略成员访问)对重载解析都是可见的

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


如果您想在构造
B
时调用
A::A(int)
,您可以自己实现
B::B(int)
,这样它就可以调用它。

如果使用
声明的
的当前访问说明符更改了“继承”构造函数的访问说明符,那么就没有办法单独使用“继承”构造函数了构造函数具有不同的访问说明符


如果基类确实有多个具有不同访问权限的构造函数,那么通常需要将可访问性保留在派生类中。使用
的规则使这成为可能。

因为这就是指定语言的方式。
class A {
protected:
    A(int) {}
};

struct B : public A {
public:
    using A::A;
};

void print(B b) {}

int main(int argc, char** argv) {
    print(1);
    return 0;
}