Это не правильный дизайн. operator new
функция должна
вернуть необработанную память, а не построенный объект. Если ваша цель для
вызов new Base
для фактического создания нового Child
, это не может быть
сделано в C ++; обычное решение состоит в том, чтобы обеспечить фабричный метод в
Base
; например:
class Base
{
// Ban the expression `new Base`...
void* operator new(size_t);
protected:
virtual ~Base(); // Ban instances on the stack.
public:
static Base* create(/*...*/);
// ...
};
Затем в исходном файле:
class Child : public Base
{
// ...
};
Base* Base::create(/*...*/)
{
return ::new Child(/*...*/);
}
(Обратите внимание, что приватный operator new
не полностью запрещает код клиента
от использования оператора new
, так как всегда можно написать ::new Base
.)
Кроме объявления частного operator new
о запрете прямого распределения,
единственное использование operator new
членов - это выделение экземпляров из
конкретный бассейн; в этом случае вам также нужен член operator delete
функция, чтобы освободить их в бассейн.