Это «возможно» в некотором смысле (если ваша цель состояла в том, что производный класс остается абстрактным в противном случае). Но это не даст результата, который вам бы хотелось: поскольку компилятор сам создаст деструктор, если программист этого не сделал.
Это не можно заставить автора производного класса явно объявить конструктор.
(редактирование: Как @chubsdad
заметки
отметил, ошибка в вашем конкретном коде, потому что вы должны определить явно объявленный деструктор базового класса).
Редактировать: Просто для удовольствия, там являются ситуации, necessiate явно объявленный конструктор. Рассмотрим следующий
struct Viral {
struct Dose { };
protected:
~Viral() throw (Dose) { }
};
struct Base {
virtual ~Base() throw() { }
};
struct Derived : Base, Viral { };
Этот код не будет компилироваться, поскольку неявно объявляется ~Derived
будет иметь спецификацию исключения throw (Dose)
, которая слабее, чем то, что ~Base
имеет - так это нарушает требование, что overriders не должен иметь рыхлую спецификацию исключений. Вам нужно будет явно объявить деструктор соответствующего
struct Derived : Base, Viral { ~Derived() throw() { } };
Но это на самом деле не решение вашей проблемы, потому что производные классы должны «сотрудничать» в либо выводе из Viral
или положить его в качестве нестатического элемента данных , Это также очень некрасиво :)
Edit: Ниже кажется быть стандартом, соответствующим способ сделать это
struct Viral {
struct Dose { };
protected:
~Viral() throw (Dose) { }
};
struct Base : virtual Viral {
virtual ~Base() throw() { }
};
Clang и GCC (starting with v4.6) отвергают любой производный класс Base
, который имеют неявно объявленный деструктор, поскольку он имеет несовместимую спецификацию исключений (любой производный класс должен называть ~Viral
напрямую, а не опосредованно, вызывая ~Base
, говорится в стандарте). Комо соглашается с этим, но я сильно подозреваю, что в этом отношении он не соответствует требованиям.
+1 для того, что, вероятно, самый компактный, но автономный примерный код, который я видел до сих пор. :-D – DevSolar
Почему? Какой смысл заставлять пользователя писать больше кода? Если у вас есть очистка, сделайте это самостоятельно, не ставьте бремя на пользователя; если вы этого не сделаете, это бесполезно. Не могли бы вы привести пример ситуации, в которой это было бы действительно полезно? –
@Matthieu M .: генерируемый код пропускает только void *, а потом создаются дочерние элементы, а потом потом случайные функции в случайном порядке, чтобы передать params/child родителям. Ужасный беспорядок. Каждая структура получит пустоту *, и я должен помнить, чтобы ее очистить. Возможно, auto_ptr решит его, но я не уверен в побочных эффектах, и половина классов, похоже, будет выполнена. – 2010-09-13 13:07:28