Задать вопрос
@alex_ak1

Нормально ли использовать dynamic_cast?

Здравствуйте.
Есть иерархия классов и некий отдельный "специфичный класс", который является вторым наследником для нескольких классов из первой иерархии.
Я обхожу все классы и пытаюсь каждый сконвертировать через dynamic_cast к специфичному классу. Иногда это получается (там где есть такой родитель).
Вопросы
1. Это нормальный способ работы с классами или какой-то лайфхак от с++ и лучше такое не использовать?
2. Это производительно или в критичные места такое лучше не совать?

#include <iostream>
#include <vector>

class Base {
public :
virtual ~Base() = default;
virtual void printName() = 0;
};

class Specific
{
    public:
    virtual void specific() = 0;
};

class A : public Base, public Specific {
public :
    void printName() override {
        std::cout << "A\n";
    }

    void specific() override
    {
        std::cout << "Specific\n";
    }
};

class B : virtual public Base {
public :
    void printName() override {
        std::cout << "B\n";
    }
};

class C : public Base {
public :
    void printName() override {
        std::cout << "C\n";
    }  
};

int main()
{
    std::vector<Base*> lst;

    lst.push_back( new B() );
    lst.push_back( new C() );
    lst.push_back( new A() );

    for( auto& n: lst )
    {
        n->printName();    
        if (Specific* s = dynamic_cast<Specific*>(n))
            s->specific();
    }

    return 0;
}
  • Вопрос задан
  • 91 просмотр
Подписаться 1 Простой 9 комментариев
Пригласить эксперта
Ответы на вопрос 1
1. Не надо путать "класс" и "экземпляр класса" (объект)

2. dynamic_cast не дороже, чем вызов виртуального метода

3. То что ты в коде делаешь dynamic_cast - это странно и уже как-то нехорошо попахивает. Зачем тебе вообще тогда наследование, если какие-то конкретные классы ты по особенному обрабатываешь?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы