1

我在公司中使用了第三方库。在其中,我需要的一些类定义如下:

class A
{};

class B : public A
{};

class C : public A
{};

class Foo
 : public B
 , public C
 , public A
{};

在这里,我需要在 Foo 和它的所有基类之间获得偏移量。所以我这样编码:

int main()
{

    Foo* f = new Foo();

    int_ptr ptrb = ((B*)(Foo*)0x1) - 0x1;
    int_ptr ptrc = ((C*)(Foo*)0x1) - 0x1;

    int_ptr ptra = ((A*)(Foo*)0x1) - 0x1;     // error
    A *ptr = (A*)(Foo*)f;     // error

    cout << "Hello world!" << endl;
    return 0;
}

在VC2010和VC2012中,一切正常。

但在 GCC 4.7.3 中,会有一个“Ambiguous base”编译错误。

我不得修改声明的任何代码。我怎样才能获得 Foo 和最后一个“公共 A”之间的偏移量?

4

1 回答 1

0

您的代码可以简化:

class A
{};

class B : public A
{};

class Foo
 : public B
 , public A
{};

这里的Foo类有两个A基类

  • A一个名为的间接基类Foo::B::A
  • A无法在 C++ 中命名的直接基类

您将能够获得对象的B::A基类子Foo对象:

Foo f;
B &b = f;
A &a = b;

但不是其他A无法命名的基类子对象。

您创建了一个模棱两可的继承情况。

结论:不要那样做。

另外:我真的不知道你真正想做什么。

于 2013-05-14T05:32:55.313 回答