繁体   English   中英

覆盖模棱两可的遗产

[英]override ambiguous inheritence

我正在努力提供一组需要结构感知的序列化方法。 因此,我构建了一个类模板,为从中继承的所有类提供这些方法。

这就是我现在所拥有的:

template<typename T>
class serializable
{
    protected:
        serializable() = default;
    public:
        size_t size_of() { return sizeof(T); }
        void   dump(void* data) { std::memcpy(data, this, serializable<T>::size_of()); }
        void   load(void* data) { std::memcpy(this, data, serializable<T>::size_of()); }
        virtual void serialize()
        {
            std::cout << "Default serialize : size " << serializable<T>::size_of() << std::endl;
        }
};

struct point : public serializable<point>
{
    float p[3];
};
struct particle : public point, public serializable<particle>
{
    float v[3];
};

int main()
{
    particle p;
    p.serialize();

    return 0;
}

问题是当调用p.serialize ,编译器在serializable<point>::serialize()serializable<particle>::serialize()之间发出一个模糊的重载错误。

我怎么解决这个问题? 是否有任何方法可以将继承从可serializable<point>覆盖到仅考虑可serializable<particle> 我应该考虑另一种方法吗?

你可以引入你想要的serialize

struct particle : public point, public serializable<particle>
{
    using serializable<particle>::serialize;
    float v[3];
};

但是你可能只想使用构图:

struct particle : public serializable<particle>
{
    point p;
    float v[3];
};

我怎么解决这个问题?

覆盖particle serialize() 无论如何,您还需要序列化点数据和粒子自己的数据。 从基类serialize的默认实现将无法为particle做正确的事情。

您还需要重写serialize()point出于同样的原因。

另外,我觉得做point基类的particle看起来不正确。 particle不是一个point 它有一个位置和速度。 聚合似乎对我来说是更好的方法。

struct point : public serializable<point>
{
   void serialize()
   {
      // Serialize p
      // ...
   }

   float p[3];
};

struct particle : public serializable<particle>
{
   void serialize()
   {
      // Serialize location.
      p.serialize();

      // Serialize velocity.
      // ...
   }

   point p; 
   float v[3];
};

serializable问题

根据您对serializable的示例用法来判断:

    void   dump(void* data) { std::memcpy(data, this, serializable<T>::size_of()); }
    void   load(void* data) { std::memcpy(this, data, serializable<T>::size_of()); }

将导致未定义的行为。 派生类不是TriviallyCopyable 在这些类型上使用std::memcpy会立即导致问题。

查看我上周发布的问题的答案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM