Наследование операторов new и delete
Если перегрузить операторы new и delete для некоторого класса, перегруженные версии будут
унаследованы производными классами. Ничто не помешает вам снова перегрузить new и/или delete в одном из этих производных классов.
class Bar : public Foo {
public:
virtual ~Bar(); // Foo::~Foo тоже должен быть виртуальным
void* operator new(size_t bytes);
void operator delete(void* space, size_t bytes);
};
С виртуальным деструктором все работает. Если деструктор не виртуальный, в следующем фрагменте будет вызван правильный оператор new и оператор delete базового класса:
Foo* foo = new Bar;
delete foo;
Хотя этот фрагмент работает, подобное переопределение перегруженных операторов обычно считается дурным тоном. Во всяком случае в кругу знатоков С++ о таких вещах не говорят. Когда производный класс начинает вмешиваться в управление памятью базового класса, во всей программе начинают возникать непредвиденные эффекты. Если вам захочется использовать несколько стратегий управления памятью в одной иерархии классов, лучше сразу включить нужную стратегию в конкретный производный класс средствами множественного наследования, чем унаследовать ее и потом заявить в производном классе: «Ха-ха, я пошутил».