std :: bad_cast vs NULL, в чем разница? - PullRequest
1 голос
/ 16 июня 2020

Почему нам нужен std::bad_cast, когда он возвращает Null, когда он терпит неудачу?

Я узнал, что когда dynamic_cast терпит неудачу, он возвращает Null Поэтому я мог проверить, был ли возвращен Null, это означает произошла ошибка.

Но почему исключение std::bad_cast было добавлено в C ++?

Ответы [ 2 ]

6 голосов
/ 16 июня 2020

Потому что у вас не может быть нулевой ссылки. Команда dynamic_cast<T*> может вернуть nullptr как ошибку, но dynamic_cast<T&> не может, поскольку вы возвращаете ссылку на объект. В этом случае вам нужно исключение, чтобы знать, что приведение не выполнено.

1 голос
/ 16 июня 2020

std::bad_cast выбрасывается при приведении ссылки

С приведением указателя, как вы упомянули, вы можете использовать dynamic_cast

Base* b = dynamic_cast<Base*>(a);  // could return nullptr

Со ссылкой вы не можете назначить nullptr

try
{
    Base& b = dynamic_cast<Base&>(a);
} 
catch(const std::bad_cast& e)
{
    std::cout << e.what() << '\n';
}

, поэтому std::bad_cast предоставляет механизм, позволяющий узнать, что приведение не выполнено.

...