Как я могу получить адрес класса из его базы в множественном наследовании?

Я использовал третью библиотеку в моей компании. В нем некоторые классы, которые мне нужны, определены следующим образом:

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»?

1

Решение

Ваш код может быть упрощен:

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 подобъект базового класса, который невозможно назвать.

Вы создали двусмысленное наследство ситуация.

Заключение: не делай этого.

Кроме того: я действительно понятия не имею, что вы действительно пытались сделать.

0

Другие решения

Других решений пока нет …