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