Мой ответ в соответствии с компилятором Linux, и, надеюсь, это должно быть верно для всех.Порядок вылова зависит от 2 факторов:
(1) First First First First Choice ;Если базовый класс появится раньше производного, ему будет предоставлен выбор.Некоторые компиляторы предупреждают об этом, некоторые - нет;
(2) Тип наследования ;Публичный или непубличный (частный / защищенный)
struct B {};
struct D : B {};
struct DD : D {};
int main()
{
for(int i = 0; i < 3; i++)
{
try
{
switch(i)
{
case 0: throw new B;
case 1: throw new D;
case 2: throw new DD;
}
}
catch(B *o) { cout<<"B* caught\n"; }
catch(D *o) { cout<<"D* caught\n"; }
catch(DD *o) { cout<<"DD* caught\n"; }
}
}
(1) В приведенном выше коде он всегда ловит B. Если вы измените порядок с перехватом DD, D, B, то это будет в соответствии сваши ожидания, где предпочтение будет отдано производным классам.
(2) Теперь замените 'struct' на 'class' или измените наследование на private / protected;В приведенном выше коде, независимо от порядка, уловы будут соответствовать типу броска.Это будет настолько строго, что даже если вы удалите какой-либо из уловов класса Derived, он не будет пойман базовым классом.