Можно ли предоставить исключения в C++ виртуального (чистого) члена класса?
Если так, как?
Я знаю, как предоставить спецификации исключений для таких членов, как
class SOMEClass
{
public:
void method(void) throw (SOMEException);
virtual void pure_method(void) = 0;
};
Таким образом method
только броски SOMEException
, Если я хочу убедиться, что подклассы SOMEClass
бросать SOMEException
за pure_method
Можно ли добавить спецификацию исключений? Реален ли этот подход или мне нужно больше разбираться в исключениях и абстрактных методах, чтобы выяснить, почему это можно (а не) сделать?
3 ответа
Да, чистый виртуальный член может иметь спецификацию исключений.
Я рекомендую вам прочитать это: http://www.gotw.ca/publications/mill22.htm прежде чем слишком увлекаться спецификациями исключений.
Да, я уверен, что поместил спецификацию исключений в чисто виртуальную функцию, хотя я не пробовал ее.
Тем не менее, большинство экспертов C++ согласны с тем, что кроме спецификаций nothrow, спецификации исключений C++ довольно бесполезны, и хотя они являются подсказкой для компилятора, они не применяются так же, как в Java.
Если вы не поместите соответствующий блок catch-all в каждую реализацию вашей чисто виртуальной функции, вы просто не сможете гарантировать, что она будет генерировать только исключения, перечисленные в спецификации исключений.
virtual void action() throw() = 0;
Это возможно. Но разумно только для throw(). Компилятор будет предупреждать вас каждый раз, когда производный класс забывает добавить спецификацию throw() в своем объявлении метода action.