Если я правильно понимаю:
class Base { /*...*/ };
class Derived: public Base { public: using Base::Base; }
обеспечит наследование всех Base
конструкторов в Derived
.
Но как насчет открытых / защищенных / частных конструкторов?
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
, но он все еще может получить доступ к закрытому / защищенному конструктору Derived
, унаследованному от Base
).
Это правильное и стандартное поведение?