继承公共/受保护/私有构造函数
Inheriting public/protected/private constructors
如果我理解正确:
class Base { /*...*/ };
class Derived: public Base { public: using Base::Base; }
将强制继承 Derived
中的所有Base
构造函数。
但是公共/受保护/私有构造函数呢?
class Base {
friend void g();
public:
Base (A a);
protected:
Base (B b);
private:
Base (C c);
};
class Derived: public Base {
public:
using Derived::Derived;
};
我找不到任何规范,但我尝试了以下内容:
void f () {
Derived{A{}}; // OK
Derived{B{}}; // Inaccessible
Derived{C{}}; // Inaccessible
}
void g () {
Derived{A{}}; // OK
Derived{B{}}; // OK
Derived{C{}}; // OK
}
因此,在决定继承哪些构造函数(它继承私有构造函数(时,using Base::Base
似乎没有考虑访问修饰符,但它使用这些修饰符继承它们(其他人仍然无法访问私有/受保护的修饰符(,并且它允许私有/受保护的访问Base
的朋友(友谊不是继承的,所以g
不是Derived
的朋友, 但它仍然可以访问从Base
继承Derived
的私有/受保护构造函数(。
这是正确和标准的行为吗?
您正在寻找的规范在 [namespace.udecl] ¶19 中,强调我的。
命名构造函数的 using 声明器不会创建同义词; 相反,如果其他构造函数在用于构造相应基的对象时可访问,则其他构造函数是可访问的 类,并且 using 声明的可访问性将被忽略。
您的测试与该段落一致。辅助功能检查失败或通过,与在检查的作用域中构造Base
时完全相同。
相关文章:
- C++:为什么无法在派生类中访问受保护的构造函数?
- 在父类中公开受保护的构造函数
- 为什么继承的受保护构造函数不能公开?
- 将派生类构造函数参数传递给受保护的成员
- 在派生类的构造函数初始化中无法访问受保护的函数
- 尝试从基类访问受保护的构造函数时出现错误 C2248
- 继承公共/受保护/私有构造函数
- 更改了C 17中受保护构造函数的规则
- C 非堆工厂对象创建具有受保护的构造函数和复制构造函数
- 在C 中的多级虚拟继承中受保护的构造函数
- 将std :: shared_ptr与受保护的构造函数 destructor一起使用
- 检测(可能是抽象的)基类的受保护构造函数
- 初始化类构造函数中的受保护常量
- 模板化转换构造函数无法访问受保护的数据成员
- 如果基类构造函数受到保护,为什么我们不能在派生类函数中创建基类对象
- 如果使单一实例构造函数受到保护,缺点是什么 - 继承 - C++11.
- 错误 LNK2019:函数"受保护:XYX()"中引用_Direct3DCreate9Ex@8未解析的外部符号
- C++如何初始化std::istream*,尽管构造函数受到保护
- c++错误:基函数受保护
- 是什么使构造函数受到保护