Подтвердить что ты не робот

Что это сообщение об ошибке о неявно удаленных виртуальных деструкторах?

Я только что обновил GCC от (я думаю) 4.5.6 до 4.6.1 под Windows, MinGW. Внезапно мой базовый класс NonInstantiable (из которого вы наследуете виртуальный виртуальный объект для предотвращения создания экземпляра) отказывается работать со следующими и аналогичными сообщениями об ошибках:

#ifndef Frigo_Lang_NonInstantiable
#define Frigo_Lang_NonInstantiable

namespace Frigo
{
namespace Lang
{

/**
*   Inherit from this class if you want to make a non-instantiable class. Most
*   useful for static classes. It seems every inheritance combination
*   (public/protected/private, non-virtual/virtual) shuts off instantiation in
*   all subclasses as well.
**/

class NonInstantiable
{
private:
/*  Private Classes  */

    /**
    *   A dummy class to prevent GCC warnings about virtual
    *   constructors/destructors and no friends
    **/
    class NonInstantiableDummy { };

/*  Private Constructors  */

    /**
    *   Private constructor to prevent instantiation
    **/
    NonInstantiable() { }

    /**
    *   Private destructor to prevent instantiation on the stack. Virtual to
    *   prevent GCC warnings
    **/
    virtual ~NonInstantiable() { }

/*  Friends  */
    friend class NonInstantiableDummy;
};

}
}

#endif

Ошибки:

/code/Frigo/Util/Arrays:40:7: error: deleted function 'virtual Frigo::Util::Arrays::~Arrays()'
/code/Frigo/Lang/Object:37:11: error: overriding non-deleted function 'virtual Frigo::Lang::Object::~Object()'
/code/Frigo/Util/Arrays:40:7: error: 'virtual Frigo::Util::Arrays::~Arrays()' is implicitly deleted because the default definition would be ill-formed:
/code/Frigo/Lang/NonInstantiable:39:11: error: 'virtual Frigo::Lang::NonInstantiable::~NonInstantiable()' is private
/code/Frigo/Util/Arrays:40:7: error: within this context
/code/Frigo/Lang/NonInstantiable:39:11: error: 'virtual Frigo::Lang::NonInstantiable::~NonInstantiable()' is private
/code/Frigo/Util/Arrays:40:7: error: within this context
/code/Frigo/Util/Arrays:40:7: error: deleted function 'virtual Frigo::Util::Arrays::~Arrays()'
/code/Frigo/Lang/NonInstantiable:39:11: error: overriding non-deleted function 'virtual Frigo::Lang::NonInstantiable::~NonInstantiable()'

Я подозреваю, что это потому, что я не создаю деструкторов, виртуальных или других, в дочерних классах, и это как-то конфликтует с частным виртуальным деструктором NonInstantiable, но мне нужно подтверждение. И решение, как исправить мой NonInstantiable класс, чтобы подавить эти ошибки, но все же работать.

4b9b3361

Ответ 1

Родительские деструкторы всегда должны быть вызваны из дочернего класса (потому что это происходит автоматически), поэтому деструкторы родительского класса не могут быть частными.

Просто создайте защищенный деструктор NonInstantiable.

Также обратите внимание, что дочерний класс может обойти родителя так, как он написан явно (случайно?), вызывающий его публичный компилятор, созданный компилятором.

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