如何使基类的某些构造函数只能由特定的派生类调用?

iam*_*ind 1 c++ inheritance constructor c++11

struct Base {
  Base (type1, type2, type3);
  Base (); // <--- should be invoked only by `Derived_2`
  virtual ~Base() = 0;  // an abstract class
};
Run Code Online (Sandbox Code Playgroud)

说上面Base,我们有多个派生类:Derived_1,Derived_2,..., Derived_N.

在构造对象时,所有派生类都必须调用Base(type1, type2, type3)构造函数,除了在构造对象时Derived_2应该使用Base()(默认构造函数).

有没有办法(C++ 11可以)有这样的规则?换句话说,如果除了Derived_2尝试使用默认的无参数构造函数之外的任何人,则编译器应该给出错误.

编辑:对于那些询问设计问题的人,我同意这一点.这是我的看法.

  • 实际上理想情况下我根本不需要默认的构造函数.所有人都必须使用争论的构造函数,它以 形式获取运行时参数type1, type2, type3.
  • 现在,我在继承层次结构中看到几个类,它们的对象将在main()执行之前全局实例化.当然这些是特殊情况,必须通过引入默认构造函数来娱乐它们
  • 然而,这种治疗仅适用于1或2类.休息所有类必须保持调用争论构造函数的规则.

我希望这会让这个想法变得清晰.

jte*_*epe 7

我能想到的唯一方法是声明你Base的默认构造函数是私有的并且Derived_2是你的Base类的朋友,所以它可以调用它的默认构造函数.

但是,这种风格很糟糕,因为你的Base类现在必须知道它的一个派生类.并且仍然可以Dervived_2使用3个参数调用构造函数.