2010-01-28 5 views
1

Возможные Дубликаты:
C++ pointer multi-inheritance fun.
more c++ multiple inheritance funC++ множественного наследования

Это проблема, которая возникла от операций с реф подсчетом указателя базового класса и нарезание резьб удовольствие.

Дано:

class A{int x, y;}; 
class B{int xx, yy;}; 
class C: public A, public B {int z;}; 
C c; 
C* pc = &c; 
B* pb = CtoB(pc); 
A* pa = CtoA(pc); 

assert(pc == AtoC(pa)); 
assert(pc == BtoC(pb)); 

Как написать CtoB и CtoA, чтобы получить B & A части C?

Как написать AtoC и BtoC, чтобы вернуть оригинал C?

Спасибо!

Почему голоса закрываются?

Мои предыдущие два вопроса спрашивали, действительно ли что-то (ответ был «нет»); этот вопрос спрашивает: «Каков допустимый способ преобразования указателя».

+0

Вам действительно нужен третий вопрос с той же темой? http://stackoverflow.com/questions/2158512/more-c-multiple-inheritance-fun и http://stackoverflow.com/questions/2157104/c-pointer-multi-inheritance-fun – Trent

ответ

3

Вам не нужно какой-либо функции, так как C только происходит один раз из A и B. Если вы не вытекают из А или В несколько раз (без виртуального наследования), вам нужно всего лишь использовать:

A *pbb = pc; 
B *pba = pc; 

AtoC и BtoC безопасны только через:

+0

Не будет ли pbb и pba указывать на то же место тогда? Если да, то как это может быть как «А», так и «В»? – anon

+0

Они не будут указывать на одно и то же место. Компилятор точно знает, сколько их сдвигать при преобразовании C * в A */B *. Вы можете распечатать указатели/дизассемблировать для проверки. – rmn

+0

У меня на самом деле есть небольшой вызов для вас по этому вопросу, если вам интересно: http://cplusplus.co.il/2010/01/20/a-question-of-memory-layout/ – rmn

1

Чтобы получить B & A части C, вы можете попробовать:

B* pbb = static_cast<B*>(pc); 
A* pba = static_cast<A*>(pc); 

Это должно быть безопасным.

+0

Чтобы перейти в другое направление, мне нужно динамическое преобразование? – anon

+0

Я только что заметил, что на это просят 2x только с разным заголовком :) – sinek

+0

Да, чтобы пойти другим путем, вы будете использовать динамический ролик. –

Смежные вопросы