Давайте посмотрим, что произойдет, если мы определим XList
следующим образом:
class XList : public QList<X> {};
Следующее будет работать как положено:
XList* x = new XList;
delete x;
Однако следующее не будет:
QList<X>* q = new XList;
delete q;
Будет вызван деструктор
QList<X>
, но не XList
, если таковой имеется. Вот что виртуальный деструктор в базовом классе сделает для вас.
Если вы никогда не используете распределение кучи, с вами все будет в порядке, но вы готовите ловушку для сопровождающего, следующего за вами (или даже за вами через несколько месяцев).
Убедитесь, что это предположение задокументировано, и сделайте new
оператор *1018* закрытым, чтобы предотвратить создание экземпляров кучи, как вы упомянули.
Безопасной альтернативой будет сделать QList<X>
членом вашего XList
, то есть: предпочесть инкапсуляцию наследованию.