3

假设我有这个结构:

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 放在最后,但这不能保证。最好的方法是什么?

4

2 回答 2

6

撇开不正确的指针算术问题不谈(在之间填充的可能性x并使您的假设无效),以下是使用多重继承时指针y发生的情况的快速说明:this

#include <iostream>
using namespace std;

struct a {
    int aa;
    void showA() {
        cerr << this << endl;
    }
};
struct b {
    int bb;
    void showB() {
        cerr << this << endl;
    }
};
struct c : public a, b {
    int cc;
    void showC() {
        cerr << this << endl;
    }
};
int main() {
    c x;
    x.showA();
    x.showB();
    x.showC();
}

showAshowB打印不同的数字;showC打印与 相同的数字showA,因为a在碱基列表中首先列出。如果您切换ab那里,那么showCshowB将是相同的。“魔法”在 C++ 编译器中:它足够聪明,可以给每个成员函数一个正确的this指针。

于 2011-12-25T14:57:32.773 回答
1

可能你想要的是这样的:

struct vector_data
{
   union 
   {
        struct 
        {
            double x, y;
        }; 
        double data[2];
   }; 

   double& operator[](size_t index)
   {
       return data[index];
   }
}
于 2011-12-25T14:58:13.717 回答