如何从多重继承的基础中获取类地址?

how could I gain a class address from it's base in multiple-inheritance?

本文关键字:获取 地址 多重继承      更新时间:2023-10-16

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

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"之间的偏移量?

您的代码可以简化为:

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

这里Foo类有两个A基类

  • 一个间接基类A命名为Foo::B::A
  • 一个不能在c++中命名的直接基类A

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

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

但不是其他A不可能命名的基类子对象。

您创建了一个模糊继承情况。

结论:不要那样做

还有:我真的不知道你到底想做什么