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

Inheriting public/protected/private constructors

本文关键字:构造函数 受保护 继承      更新时间:2023-10-16

如果我理解正确:

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时完全相同。