Если вы точно знаете, что у вас есть B*
, указывающий на объект C
, вы можете использовать пару static_cast
s:
B* bp = new C();
C* cp = static_cast<C*>(bp);
A* ap = static_cast<A*>(cp);
Единственный способ приведения к иерархии наследования - использовать dynamic_cast
, для которого требуется, чтобы тип был полиморфным (т. Е. Ваш класс должен иметь хотя бы одну виртуальную функцию-член; , поскольку деструкторы базового класса быть virtual
, это обычно не проблема):
B* bp = new C();
A* ap = dynamic_cast<A*>(bp);
dynamic_cast
имеет дополнительное преимущество: в случае сбоя (то есть, если bp
на самом деле не указывает на C
), возвращается NULL. Недостатком является небольшая потеря производительности (static_cast
фактически свободна во время выполнения).