Во-первых, CBase
должен быть полиморфным, чтобы вы могли использовать здесь dynamic_cast
(то есть он должен иметь хотя бы одну функцию-член virtual
). В противном случае вы не сможете использовать dynamic_cast
.
Тем не менее, преобразование &b
в CDerived*
не неправильно: pd
будет нулевым указателем.
dynamic_cast
имеет полезное свойство, заключающееся в том, что при сбое приведения (то есть, если объект, на который указывает указатель, не относится к целевому типу), он дает нулевой указатель. Это позволяет вам проверить фактический тип объекта. Например:
CBase b;
CDerived d;
CBase* pb = &b;
CBase* pd = &d;
CDerived* xb = dynamic_cast<CDerived*>(pb); // xb is null!
CDerived* xd = dynamic_cast<CDerived*>(pd); // xd points to d!
Ваш код был бы неверным, если бы вы использовали static_cast
, поскольку он выполняет приведение без выполнения какой-либо проверки типа во время выполнения, а это означает, что нет способа проверить, успешно ли выполнено приведение. Если вам когда-либо понадобится преобразовать иерархию классов и вы не знаете наверняка, относится ли объект к производному типу, к которому вы пытаетесь привести, вы должны использовать dynamic_cast
.
person
James McNellis
schedule
16.03.2011