使用memset清除基类成员

时间:2014-04-09 12:01:27

标签: c++

我看到如下代码并且不喜欢它。特别是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));
    }
};

1 个答案:

答案 0 :(得分:0)

BaseStruct没有虚拟成员,所以你应该很好。 vtbl应该是BaseA。但是,如果可以明确重置每个成员,那就更好了。这是推荐的。