[英]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.