派生类可以在其ctor-initializer中调用 protected 基类构造函数,但只能用于其自己的基类子对象,而不能在其他地方:

class Base {
  protected:
    Base() {}
};

class Derived : Base {
  Base b;
  public:
    Derived(): Base(),    // OK
               b() {      // error
        Base b2;          // error
    }
};

标准对此有何说法?这是[class.protected]/1:



调用构造函数时是否涉及对象表达式?没有,有吗?那么在标准中哪里描述了 protected 基类构造函数的访问控制?

最佳答案

C++ 11§11.2/5:



对于您的构造函数调用

Base b2;

以上第三点适用。 mBase构造函数。命名类NBase。作为m成员的Base protected ,并且声明发生在派生自DerivedBase类的成员中,但作为Base成员的Derived构造函数不是公共(public),私有(private)或 protected 情况:它根本不是...的成员Derived,构造函数不是隐式继承的。

我认为“公开,私有(private)或 protected ”语言很尴尬;我只能推测,这是该段内容有所改进的结果。

我还没有找到关于如何在Base的成员初始化器列表中正式访问 protected Derived构造函数的解释,但是随后我才开始对此问题进行研究。

更新:我无法在标准中找到任何与初始化程序列表中的构造函数有关的语言,也无法找到有关该缺陷的任何缺陷报告。这很可能是一个缺陷。

07-24 09:45
查看更多