Когда и почему деструктор в базовом классе НЕ должен определяться как виртуальный?

Этот пример ниже показывает, как предотвратить копирование производного класса. Он основан на базовом классе, в котором конструктор копирования и оператор присваивания копии объявлены закрытыми .

class Uncopyable
{
protected:
   // allow construction and destruction of derived objects...
   Uncopyable() {}
   ~Uncopyable() {}

private:
   // but prevent copying...
   Uncopyable(const Uncopyable&);
   Uncopyable& operator=(const Uncopyable&);
};

Мы можем использовать этот класс в сочетании с частным наследованием, чтобы сделать классы некопируемыми:

class derived: private Uncopyable
{...};

Обратите внимание, что деструктор в классе Uncopyable не объявлен как виртуальный.

Ранее я узнал, что

  • деструкторы в базовых классах должны быть виртуальными .
  • Деструкторы в non -base классы не следует делать виртуальными .

В этом примере деструктор для Uncopyable не является виртуальным , но наследуется от. Кажется, это противоречит мудрости, которую я усвоил ранее.

Когда и почему деструктор в базовом классе НЕ должен определяться как виртуальный ?

10
задан j0k 1 July 2013 в 14:06
поделиться