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

Тема в разделе "Общие вопросы по С и С++", создана пользователем hhome, 27 сен 2013.

  1. hhome

    hhome New Member

    Регистрация:
    27 сен 2013
    Сообщения:
    2
    Симпатии:
    0
    В википедии написано только про приведение типов

    Код (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 другие полезные свойства или только одно это?
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    dynamic_cast нужен для приведения типов во время выполнения.
    При этом если привести тип не удалось, он вернет nullptr.

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

    hhome New Member

    Регистрация:
    27 сен 2013
    Сообщения:
    2
    Симпатии:
    0
    Спасибо :)
     
  4. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    Остается добавить, что dynamic_cast-a рекомендуется избегать.
    наличие динамиккаста - признак говнокода )

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

    Whatka Well-Known Member

    Регистрация:
    9 окт 2011
    Сообщения:
    433
    Симпатии:
    4
    согласен с r04
    встречал использование вместо typeid

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

    try{
    sp = dynamic_cast <Son *> (fp);
    ..
    }
    //
     
Загрузка...

Поделиться этой страницей