使用 memset 清除基类成员

Posted

技术标签:

【中文标题】使用 memset 清除基类成员【英文标题】:Using memset to clear base class members 【发布时间】: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));
    
;

【问题讨论】:

这是未定义的行为。无需再多说什么来证明对整个事情进行分类是合理的。 Empty derived optimization的可能重复 memset 替换为*this = BaseStruct();,或者在C++11 中,替换为static_cast&lt;BaseStruct&gt;(*this) = ;。归零没有令人讨厌的未定义行为。 这里有一些解决方案:***.com/a/38103250/3223828 【参考方案1】:

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

【讨论】:

以上是关于使用 memset 清除基类成员的主要内容,如果未能解决你的问题,请参考以下文章

从基类访问子类成员的首选方式

如何在基类构造函数中使用派生类成员

如何使用多态性从基类访问派生类向量成员?

急急急!!!!C# 中关于子类访问基类成员的可访问性

C++中的派生类,可以不定义对象直接调用基类的成员和调用自己的成员函数嘛???

C++派生类是不是可以从基类继承静态数据成员和静态成员函数?