В этом руководстве по C ++ , в разделе «Стандартные исключения» есть этот пример кода, который использует класс, производный от стандартного класса исключений в STL:
// standard exceptions
#include
#include
using namespace std;
class myexception: public exception
{
virtual const char* what() const throw()
{
return "My exception happened";
}
} myex; //Declares an instance of myexception outside of the main function
int main () {
try
{
throw myex;
}
catch (exception& e) //My question is regarding this line of code
{
cout << e.what() << endl;
}
return 0;
}
Этот код распечатывает Мое исключение произошло
. Однако, если я удалю амперсанд, он распечатает std :: exception
, что происходит, когда вы вызываете what ()
со стандартным классом исключений, а не с производным классом.
На веб-сайте дается следующее объяснение:
Мы разместили обработчик, который перехватывает объекты исключений по ссылке (обратите внимание на амперсанд & после типа), поэтому он также перехватывает классы , производные от исключение, как и наш объект myex класса myexception.
Выбрасывание myex
похоже на «вызов функции catch
и передачу myex
в качестве параметра»? Поскольку в этом случае я мог бы представить, что не имеет значения, генерируете ли вы исключение по значению или по ссылке (это то, что амперсанд делает правильно?), Потому что вы по-прежнему генерируете myexception
, а не исключение
. И из-за динамического связывания и полиморфизма или чего-то подобного, e.what ()
все равно должен распечатать Мое исключение произошло
, а не std :: exception
.