При поиске ответа для этого запроса с написанием тестового кода я узнал, что частное / защищенное наследование изменяет способ получения исключений из различных классов, что было очень удивительно. Чтобы найти ответ, я сослался на предыдущие вопросы на форуме и наткнулся на этот похожий вопрос .
Для меня вполне очевидно использовать protected
наследование для базового класса с virtual
методами. Не обращая внимания на стандарт, я хотел бы знать , почему в C ++ обработка исключений ограничена наследованием, когда вызовы виртуальных методов не ?
Следующий фрагмент объясняет это:
struct Base { virtual void printError () = 0; };
class Derived : protected Base { void printError () { } };
int main ()
{
try {
throw new Derived;
}
catch(Base *p) { p->printError(); } // Ideal; but not invoked
catch(void *p) { ((Base*)p)->printError(); } // Ugly; but only way to invoke
}
Edit:
Если мы рассматриваем конфиденциальность как ответ; принято. Но тогда почему он применим только для catch()
получения базовых указателей, а также для функций, получающих базовые указатели?