假设我有这个结构:
struct vector_data
{
double x, y;
double& operator[](size_t index)
{
return * (static_cast<double*>(static_cast<void*>(this)) + index);
}
};
operator[] 应该按预期工作,因为 vector_data 是 POD 类型。预期的行为是 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 继承,但假设组合包含虚函数。我知道大多数编译器将 vtable 放在最后,但这不能保证。最好的方法是什么?