Бросая и ловя, делает несколько копий-вызовов. Читать немного информации .
Чтобы посмотреть, как это работает, я добавил в ваш код:
#include <iostream>
using namespace std;
class Base
{
public:
Base()
{
cout<<"Base Ctor!\n";
}
~Base()
{
cout<<"Base Dtor!\n";
}
Base(Base& other)
{
cout<<"Base Copy Ctor!\n";
}
};
class Derived : public Base
{
public:
Derived()
{
cout<<"Derived Ctor!\n";
}
~Derived()
{
cout<<"Derived Dtor!\n";
}
Derived(Derived& other)
{
cout<<"Derived Copy Ctor!\n";
}
};
int main()
{
Derived d;
try
{
cout << "Before throwing d\n";
throw d;
cout << "After throwing d\n";
}
catch (Base b)
{
cout<<"Caught Base Exception!\n";
}
catch (Derived d)
{
cout<<"Caught Derived Exception!\n";
}
return 0;
}
Вы можете увидеть это в действии здесь . К настоящему времени игнорируйте предупреждения о неиспользованных переменных. Другие предупреждения полезны, так как они предлагают вызывать базовый copy-ctor из производного copy-ctor. Измените код и немного поиграйте с ним.
Выводит:
Base Ctor!
Derived Ctor!
Before throwing d
Base Ctor!
Derived Copy Ctor!
Base Copy Ctor!
Caught Base Exception!
Base Dtor!
Derived Dtor!
Base Dtor!
Derived Dtor!
Base Dtor!