【问题标题】:Inheriting public/protected/private constructors继承公共/受保护/私有构造函数
【发布时间】:2019-08-24 21:41:09
【问题描述】:

如果我理解正确:

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 的私有/受保护构造函数)。

这是正确和标准的行为吗?

【问题讨论】:

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


    【解决方案1】:

    您正在寻找的规范在 [namespace.udecl] ¶19,强调我的。

    命名构造函数的using-declarator不会创建同义词; 相反,如果附加构造函数在用于构造相应基类的对象时可访问,则它们是可访问的 类using-declaration的可访问性被忽略。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 2015-07-14
      • 1970-01-01
      • 2017-06-19
      • 1970-01-01
      • 2016-04-07
      • 2012-02-15
      相关资源
      最近更新 更多