虚拟构造词成语 - 良性或完全彻底的谬误

3 c++ design-patterns virtual-functions idioms undefined-behavior

C++中的一个重要规则是实例的生命周期在其构造函数成功完成时开始,在其析构函数开始时结束.

根据这条规则,我们得出结论,在构造函数中调用虚方法并不是一个好主意,因为可能的派生实例无效会导致未定义的行为.

C++ FAQ 20.8中提到的Virtual Constructor Idiom 似乎表明了相反的情况.

我的问题是:

  • 标准中用于定义对象相对于来自构造函数和析构函数的调用的生命周期的确切定义是什么?
  • 而且所谓的"虚拟构造函数Idom"是否有效?

NPE*_*NPE 7

我认为你混淆了两个独立的(如果含糊不清).

  1. 众所周知,由于这里讨论的原因,不应该从构造函数(直接或间接)调用虚函数.
  2. FAQ正在谈论的是从虚函数调用构造函数.在某种意义上,它与#1相反.我们的想法是根据某个现有对象的动态类型选择构造函数(即类).