【发布时间】:2014-04-09 12:01:27
【问题描述】:
我看到如下代码但不喜欢它。特别是 memset(static_cast(this), 0, sizeof(BaseStruct)); 我需要重构的参数,在这里找到了一个:Why can it be dangerous to use this POD struct as a base class?
您是否发现更多问题? vtable有危险吗?
// abstract class
class BaseA {
public:
virtual void doSomethingA() = 0;
};
// no method, no virtual method, only simple data
typedef struct BaseStruct {
int x;
float y;
long z[10];
} BaseStruct;
class Subclass : public BaseA, public BaseStruct {
public:
virtual void doSomethingA() {}
virtual void doSomethingElse() {}
void resetBaseA() {
memset(static_cast<BaseStruct*>(this), 0, sizeof(BaseStruct));
}
};
【问题讨论】:
-
这是未定义的行为。无需再多说什么来证明对整个事情进行分类是合理的。
-
将
memset替换为*this = BaseStruct();,或者在C++11 中,替换为static_cast<BaseStruct>(*this) = {};。归零没有令人讨厌的未定义行为。 -
这里有一些解决方案:stackoverflow.com/a/38103250/3223828
标签: c++