Suppose I have this struct:
struct vector_data
{
double x, y;
double& operator[](size_t index)
{
return * (static_cast<double*>(static_cast<void*>(this)) + index);
}
};
由于 vector_data 是一个 POD 类型,所以 operator[] 应该按预期工作。
预期的行为是 vector_data [0] 返回 x ,vector_data [1] 返回 y。
现在假设我有第二个结构体:
struct more_data
{
double evil_data;
// There could be more here, data or functions
};
并像这样从两者派生出来:
struct composed : public more_data, public vector_data
{
};
这会破坏operator[]的预期行为吗?换句话说,派生结构体中的vector_data的this指针是否仍然指向结构体的vector_data部分,还是指向派生结构体的开头?
如果它确实破坏了operator[],那么我该如何解决这个问题呢?我可以先继承vector_data,但假设composed包含虚函数。我知道大多数编译器将vtable放在结尾,但这并不保证。最好的方法是什么?
void*
进行指针算术运算,那么什么是预期的结果(或者更确切地说,你所谓的“预期”是什么)? - Matvoid*
指针上进行算术运算是没有定义的,内部转换是无用的。 - Matreinterpret_cast
,而是要用static_cast<double*>(static_cast<void*>
呢? - curiousguy