Скажем, у нас есть конкретный класс A и абстрактный класс B.
Рассмотрим конкретный C, который наследует от A и B и реализует B:
class C : public A, public B
{
/* implementation of B and specific stuff that belongs to C */
};
ТеперьЯ определяю функцию с сигнатурой void foo(B* b);
Это мой код, я могу предположить, что все указатели на B являются и A, и B. В определении foo, как получить указатель на A?Противный, но работающий трюк состоит в том, чтобы выровнять указатели назад следующим образом:
void foo(B* b)
{
A* a = reinterpret_cast<A*>(reinterpret_cast<char*>(b) - sizeof(A));
// now I can use all the stuff from A
}
Имейте в виду, что C не имеет супертипа, и на самом деле, есть много классов, похожих на C, которые являются только A и B.Не стесняйтесь подвергать сомнению и мою логику, и этот образец дизайна, но вопрос касается только выравнивания указателей.