显式调用基类析构函数/构造函数是否合法?

Bri*_*sey 5 c++ inheritance constructor destructor

是否合法地构造和构造基类对象以重置基类已知的状态部分?

class C : public BaseClass {...};

C c;
c.BaseClass::~BaseClass();
new (static_cast<BaseClass*>(&c)) BaseClass;
Run Code Online (Sandbox Code Playgroud)

显然,如果我们可以访问类的源代码,还有其他方法可以实现这种效果.但是,我想从语言角度了解是否存在无效的具体原因.

Mik*_*our 8

不,这不合法.您不能替换对象的基础子对象.

C++ 11 3.8/7指定只能重用对象的存储

原始对象是类型为T的派生程度最高的对象(1.8),新对象是类型为T的派生程度最高的对象(也就是说,它们不是基类子对象).

您替换的对象是基类子对象,而不是最派生的对象,因此被禁止.

如果你要替换整个对象(即调用~C,然后构造一个新对象C),那么这将是合法的,但是很危险.如果构造函数抛出,那么该对象将在其生命周期结束时第二次被销毁.这将给出未定义的行为.

  • @ JamesT.Huggett:永远不会被这条规则所禁止.您只能替换最派生的对象,而不是基类子对象. (2认同)