В конце пункта 52 (Настройка new и delete) в Myer's Effective C ++ он обсуждает, как избежать скрытия обычных новых и удаленных версий при реализации пользовательской версии, следующим образом:
Если вы объявляете любойОператор новостей в классе, вы будете скрывать все эти стандартные формы.Если вы не хотите запретить клиентам этих классов использовать эти формы, обязательно сделайте их доступными в дополнение к новым пользовательским формам, которые вы создаете.Разумеется, для каждого нового оператора, которого вы делаете доступным, не забудьте также удалить соответствующего оператора.Если вы хотите, чтобы эти функции вели себя обычным образом, просто попросите ваши специфичные для класса версии вызывать глобальные версии.
Простой способ сделать это - создать базовый класс, содержащий все обычные формы новых иdelete:
class StandardNewDeleteForms {
public:
// normal new/delete
static void* operator new(std::size_t size) throw(std::bad_alloc)
{ return ::operator new(size); }
static void operator delete(void
*pMemory) throw()
{ ::operator delete(pMemory); }
// placement new/delete
static void* operator new(std::size_t size, void *ptr) throw()
{ return ::operator new(size, ptr); }
static void operator delete(void
*pMemory, void *ptr) throw()
{ return ::operator delete(pMemory, ptr); }
// nothrow new/delete
static void* operator new(std::size_t size, const std::nothrow_t& nt) throw()
{ return ::operator new(size, nt); }
static void operator delete(void
*pMemory, const std::nothrow_t&) throw()
{ ::operator delete(pMemory); }
};
Клиенты, которые хотят дополнить стандартные формы пользовательскими формами, могут просто использовать наследование и использовать объявления (см. пункт 33), чтобы получить стандартные формы:
class Widget: public StandardNewDeleteForms { // inherit std forms
public:
using StandardNewDeleteForms::operator new; // make those
using StandardNewDeleteForms::operator delete; // forms visible
static void* operator new(std::size_t size, // add a custom
std::ostream& logStream) // placement new
throw(std::bad_alloc);
static void operator delete(void
*pMemory, // add the corres-
std::ostream& logStream) // ponding place-
throw(); // ment delete
...
};
Зачем беспокоиться о создании класса StandardNewDeleteForms, наследовании от него и затем в производном классе, говоря:
using StandardNewDeleteForms::operator new;
using StandardNewDeleteForms::operator delete;
Не могли бы вы вообще отказаться от базового класса и простонаписать в классе виджетов:
using ::operator new;
using ::operator delete;
чтобы достичь того же?