继承公共/受保护/私有构造函数

时间:2019-04-03 11:13:57

标签: c++ inheritance constructor using access-modifiers

如果我正确理解:

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继承自x1)。

这是正确的标准行为吗?

1 个答案:

答案 0 :(得分:1)

您要查找的规范位于 [namespace.udecl] ¶19中,重点是我的。

  

命名构造函数的 using-declarator 不会创建同义词。   相反,如果在构造相应基础的对象时可以访问其他构造函数,则可以访问它们   类,而 using-declaration 的可访问性将被忽略。

您的测试与此段落一致。可访问性检查失败或完全通过,就像在您检查的范围中构造Base时一样。