如果我理解正确:
似乎,当决定继承哪些构造函数时,
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
的友元可以访问 Derived
继承自 Base
的私有/保护构造函数(友情关系不被继承,所以 g
不是 Derived
的朋友,但它仍然可以访问从 Base
继承的 Derived
的私有/保护构造函数)。
这是正确和标准的行为吗?