【发布时间】:2014-10-23 09:20:26
【问题描述】:
破坏和构造基类对象以重置基类已知的状态部分是否合法?
class C : public BaseClass {...};
C c;
c.BaseClass::~BaseClass();
new (static_cast<BaseClass*>(&c)) BaseClass;
如果我们可以访问类的源代码,显然还有其他方法可以实现这种效果。但是,我想从语言的角度了解这是否无效。
【问题讨论】:
-
没有。首先,不能保证
&c与其基类子对象的地址相同。 -
公平点。我添加了演员表。
-
基类中的
reconstruct方法不行吗?这听起来像是一个 X-Y 问题。 -
这是学术讨论的好问题,但从生产代码的角度来看绝对是糟糕的想法。编写一个方法
ResetBase(),在基析构函数中使用它(以避免代码加倍),如果需要从派生类调用,不要以不是为它们创建的方式与析构函数混淆。 -
如果
BaseClass是可赋值的,你可以用static_cast<BaseClass&>(c) = BaseClass();(或c++11中的static_cast<BaseClass&>(c) = {};)达到同样的效果。
标签: c++ inheritance constructor destructor