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)
显然,如果我们可以访问类的源代码,还有其他方法可以实现这种效果.但是,我想从语言角度了解是否存在无效的具体原因.
不,这不合法.您不能替换对象的基础子对象.
C++ 11 3.8/7指定只能重用对象的存储
原始对象是类型为T的派生程度最高的对象(1.8),新对象是类型为T的派生程度最高的对象(也就是说,它们不是基类子对象).
您替换的对象是基类子对象,而不是最派生的对象,因此被禁止.
如果你要替换整个对象(即调用~C,然后构造一个新对象C),那么这将是合法的,但是很危险.如果构造函数抛出,那么该对象将在其生命周期结束时第二次被销毁.这将给出未定义的行为.