Код:
throw SpecialException();
Это значение по умолчанию - создает экземпляр SpecialException
и выбрасывает его. Для SpecialException
не зарегистрирован зарегистрированный специальный обработчик, но есть один для базового класса, GeneralException
, по значению , что означает, что ваш экземпляр SpecialException
будет скопирован с помощью copy-ctor-slice вGeneralException
, и в результате получается печать .. G
, если вы надеялись / ожидали печати S
, вы должны поймать это исключение по ссылке, предпочтительно const
, что потребует создания print
const в обеих реализациях. Результат будет выглядеть так:
#include <iostream>
struct GeneralException {
virtual void print() const { std::cout << "G"; }
};
struct SpecialException : public GeneralException {
void print() const override { std::cout << "S"; }
};
void f() { throw SpecialException(); }
int main() {
try {
f();
}
catch (GeneralException const& e) {
e.print();
}
}
Вывод
S