Я использовал третью библиотеку в моей компании. В нем некоторые классы, которые мне нужны, определены следующим образом:
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 будет ошибка компиляции «Неоднозначная база».
Я не могу изменять любой код декларации.
Как я мог получить смещение между Foo и последней «публичной A»?
Ваш код может быть упрощен:
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
подобъект базового класса, который невозможно назвать.
Вы создали двусмысленное наследство ситуация.
Заключение: не делай этого.
Кроме того: я действительно понятия не имею, что вы действительно пытались сделать.
Других решений пока нет …