Почему наследование влияет на обработку исключений? - PullRequest
7 голосов
/ 09 апреля 2011

При поиске ответа для этого запроса с написанием тестового кода я узнал, что частное / защищенное наследование изменяет способ получения исключений из различных классов, что было очень удивительно. Чтобы найти ответ, я сослался на предыдущие вопросы на форуме и наткнулся на этот похожий вопрос .

Для меня вполне очевидно использовать 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() получения базовых указателей, а также для функций, получающих базовые указатели?

Ответы [ 2 ]

10 голосов
/ 09 апреля 2011

Значение наследования private и protected заключается в том, что никто за пределами класса или иерархии классов не может знать о наследовании. Это так же, как никто за пределами класса не может знать о частном члене.
Отлов производного класса по его базовому классу показал сборщику, что производный класс фактически является производным от базового класса и является нарушением конфиденциальности наследства.

5 голосов
/ 09 апреля 2011

protected наследование означает только Derived и его подклассы "знают", что оно также является -a Base.main и оператор catch не «знает» об этом.Это точка наследования с определенным доступом.

Виртуальная диспетчеризация не заботится об этом - если у вас есть доступ для вызова виртуальной функции, тогда используется виртуальная диспетчеризация .

В вашем примере вы не можете использовать Derived, как если бы он был Base где-либо еще в области действия main - поэтому имеет смысл, что вы не можете сделать это и в catch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...