Я хочу исключить собственные исключения из базового класса Exception
. Существует print
виртуального метода, которая будет перезаписана подклассами. Я только поймаю тип Exception&
и использую print
чтобы получить конкретную ошибку. Проблема заключается в том, что как только я бросаю ссылку на подкласс, он транслируется так, как если бы это был базовый класс.
Вот пример:
#include <iostream>
using namespace std;
class Exception
{
public:
virtual void print()
{
cout << "Exception" << endl;
}
};
class IllegalArgumentException : public Exception
{
public:
virtual void print()
{
cout << "IllegalArgumentException" << endl;
}
};
int main(int argc, char **argv)
{
try
{
IllegalArgumentException i;
Exception& ref = i;
cout << "ref.print: ";
ref.print();
throw ref;
}
catch(Exception& e)
{
cout << "catched: ";
e.print();
}
}
Результат этого примера:
ref.print: IllegalArgumentException
catched: Exception
Использование ссылки должно приводить к методу print
из используемого производного класса. Внутри блока try ссылка использует его. Почему Exception&
Except Exception&
похоже на Exception&
IllegalArgumentException
и как я могу получить это поведение?
Следующий код, похоже, делает то, что он должен:
try
{
IllegalArgumentException i;
Exception* pointer = &i;
throw pointer;
}
catch(Exception* e)
{
cout << "pointer catched: ";
e->print();
}
но не может ли указатель стать недействительным вне области действия блока try? Тогда было бы рискованно делать это, и если я распределю память в куче, чтобы обойти эту проблему, я не могу нести ответственность за удаление внутри блока catch. Итак, как бы вы решили проблему?