Для Чего Нежен Dynamic_cast?

  • Автор темы hhome
  • Дата начала
H

hhome

#1
В википедии написано только про приведение типов

C++:
class A
{
public:
virtual void foo()	{}
};

class B : public A
{
public:
void methodSpecificToB()	{ std::cout << "B::methodSpecificToB()\n"; }
};


void my_function(A &my_a)
{
try
{
B &my_b =dynamic_cast<B&>(my_a);
my_b.methodSpecificToB();
}
catch (const std::bad_cast& e)
{
std::cerr << e.what() << std::endl;
std::cerr << "Этот объект не является объектом типа B" << std::endl;
}
}
А есть ли у dynamic_cast другие полезные свойства или только одно это?
 
R

rrrFer

#2
dynamic_cast нужен для приведения типов во время выполнения.
При этом если привести тип не удалось, он вернет nullptr.

Только для этого он и нужен.
 
R

rrrFer

#3
Остается добавить, что dynamic_cast-a рекомендуется избегать.
наличие динамиккаста - признак говнокода )

И только в редких случаях он оправдан.
Суть в том, что с++ - язык с жесткой типизацией, которая позволяет проводить кучу проверок во время компиляции.
Проверки во время выполнения не безопасны и могу приводить к ошибкам, которые трудно найти.
 
W

Whatka

#4
согласен с r04
встречал использование вместо typeid

C++:
//
Father *fp;
Son *sp;//класс наследник )
...
if(typeid(*fp)==typeid(Son))
sp=(Son*) fp;

try{
sp = dynamic_cast <Son *> (fp);
..
}
//