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

标签 c++ inheritance c++11 constructor

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

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

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

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

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

  • 实际上,理想情况下我根本不需要默认构造函数。全部 必须使用带参数的构造函数,它需要运行时 type1, type2, type3 形式的参数。
  • 现在,我看到继承层次结构中的几个类 对象将在 main() 获取之前被全局实例化 执行。当然,那些是特殊情况,必须招待 他们通过引入默认构造函数
  • 但是,此治疗仅适用于 1 个或最多 2 个类(class)。休息所有 类必须保持调用有参数的构造函数的规则。

我希望这能让我的想法变得清晰。

最佳答案

我能想到的唯一方法是将您的 Base 的默认构造函数声明为私有(private)并使 Derived_2 成为您的 Base 类的友元,这样它就可以调用它的默认构造函数。

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

关于c++ - 如何使基类的某些构造函数只能由特定的派生类调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16313835/

相关文章:

c++ - 如何在 QUrl 中包含百分号

C++ 使用自己的类的元素继承堆栈

inheritance - Fortran 预处理器指令用法

c++ - std::future::wait 应该使用这么多 CPU 吗?有没有更高效的调用?

c++ - 将 Boost::Beast 用于 CPU 密集型 REST API,我应该使用异步还是同步方式来实现它们以获得更好的延迟?

c++ - 如何通过将每个命令分配给线程来在 C++ 中同时执行 linux 系统命令?

c++ - 排序 std::map<string,double>

c++ - 使用模板元编程的不同循环展开方法的优缺点

Python,selenium webdriver - 我需要基类方法来返回其子类的类型。如何实现?

c++ - 写入序列号流 `operator>>`?