【发布时间】: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