B* b = static_cast<B*>(a);
Вы должны использовать static_cast
, только если вы знаете, что a
фактически указывает на объект B
или класс, производный от B
, что явно не так.
Это неверное утверждение.
Действительная последовательность должна быть:
A* a = new B();
B* b = static_cast<B*>(a);
a
теперь указывает на объект типа B
. Это можно сделать потому, что Указатель на объект базового класса всегда может указывать на объекты производного класса, если он является открытым производным.
Теперь вы можете использовать static_cast
, потому что вы точно знаете, что a
фактически указывает на объект class B
.
Могут быть сценарии, в которых один не знает об иерархии классов и в таких сценариях нельзя использовать static_cast
C ++ предоставляет другой тип приведения, называемый Dynamic_cast
, в таких сценариях он возвращает нулевой указатель, если приведение не является допустимым в случае указателей или выбросить исключение в случае ссылок.
Обратите внимание: Dynamic_Cast
работает только с полиморфными классами.