@sddvxd

Отличие динамической проверки типов от статической?

Нужно было перевести тип ссылки из одной в другую. Нашел 2 варианта - static_cast и dynamic_cast. У первого написано, что он небезопасен, поскольку типы проверяются на этапе компиляции. Вот такой вопрос - зачем разделили проверку типов на динамическую и статическую?
  • Вопрос задан
  • 203 просмотра
Решения вопроса 3
devalone
@devalone
̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻̻
я возможно не так задал вопрос. хотелось бы узнать, почему компилятор не может все проверить на этапе компиляции. зачем еще добавлять динамическую проверку?

class Object {
public:
virtual ~Object() {}
};
class Weapon : public Object {
public:
virtual ~Weapon() {}
};
class Player : public Object {
public:
virtual ~Player() {}
};

void handleObject(Object* object) {
  // What is object? Is it weapon or player?
};

// ....

Object* object = rand() % 100 > 50 ? new Weapon() : new Player();
handleObject(object);
Ответ написан
vt4a2h
@vt4a2h Куратор тега C++
Senior software engineer (C++/Qt/boost)
Т.к. не все проверки можно сделать во время компиляции. Компилятор не знает, объект какого типа будет приводиться к какому, ведь по факту, используя интерфейс можно передать любой оъект-наследник. И тут есть два варианта: привести типы небезопасно, но быстро, или надёжно, но медленнее.
Помимо этого, есть ещё некоторые примеры использования static_cast: https://en.cppreference.com/w/cpp/language/static_cast
Ответ написан
Комментировать
@al_sh
скорее, некоторые вещи не возможно сделать без RTTI. Правило простое, если Вы уверены в конечном типе полсе приведения - static_cast, если нет - dynamic_cast
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
fzfx
@fzfx
18,5 дм
потому что у проверки каждого типа свои преимущества.
статический каст работает быстрее.
Ответ написан
Ваш ответ на вопрос

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

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