私がこの構造体を持っているとしましょう:
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を返すことです。
ここで、2番目の構造体があるとします。
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を最後に置くことは知っていますが、これは保証されていません。最善のアプローチは何でしょうか?