【问题标题】:how could I gain a class address from it's base in multiple-inheritance?我怎样才能从它的多重继承基础中获得一个类地址?
【发布时间】:2013-05-10 00:31:03
【问题描述】:

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

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

【问题讨论】:

  • 一个 Foo 对象真的应该包含 3 个 A 实例吗?在许多情况下,真正需要的是 1 个共享实例,因此您需要使用虚拟基类。
  • 如果想让offset再调用一个方法,为什么不直接调用呢?
  • 感谢您的回复。事实上,在我的项目中,我们使用了第 3 部分库。在库中有一些 COM 接口和一些类实现它们。如果有一个类实现了一些接口,我需要显示每个接口到它的类的距离。但不幸的是,我无法修改该库的任何代码。
  • retag:这是一个固有的模棱两可的继承,所以删除编译器特定的标签

标签: c++ multiple-inheritance base-class ambiguous name-lookup


【解决方案1】:

您的代码可以简化:

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 不可能命名的基类子对象。

您创建了一个不明确的继承情况。

结论:不要那样做。

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

【讨论】:

  • 好吧,谢谢。看来我只能通过使用 ((A*)(B*)(Foo*)0x1) 来反映接口 A
  • 这里我需要反映一个类实现的所有接口,但是这些类是由另一个组编码的。所以我很担心有一个像 Foo 这样的类实现了三个像 ABC 这样的接口......
  • A接口被Foo实现了两次?干什么用的?
  • 我也不知道他们为什么这么做……可能是个错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-16
  • 2022-12-09
相关资源
最近更新 更多