2012-03-28 4 views
0

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

Пусть Предположим, у меня есть эти два класса с перегруженными новыми методами:

class Base { 
public: 
operator void* new(size_t); 
}; 

class Child : public Base { 
public: 
operator void* new(size_t); //THIS, i would like this to be the "original" new. 
}; 

operator void* Base::new(size_t) { 
//... 
return new Child; 
//... 
} 

Я хотел бы Ребенок :: нового работать как оригинал новый, так что я мог избежать использования таНоса.

Есть ли способ сделать это?

Спасибо заранее!

+0

Это [ссылка] (http://blogs.msdn.com/b/calvin_hsia/archive/2009/01/19/9341632.aspx) может помочь вам ... – niktehpui

+0

Я не думаю, что ваша 'база: : operator new' really 'works' (например, каждый раз, когда 'Child' построен, он не уничтожается). Учитывая это, трудно сказать, что вы хотите сделать «Child :: operator new». Вы уверены, что не ищете заводские функции? –

+0

Хорошее чтение: [Как мне написать ISO C++ Стандартные совместимые пользовательские новые и удалить операторы?] (Http://stackoverflow.com/questions/7194127/how-should-i-write-iso-c-standard-conformant-custom -новый-и-удалить-операторов). Я не понимаю, чего вы пытаетесь достичь. Поэтому я не хочу отмечать это как дубликат, у меня есть чувство, что это то, что вы ищете. –

ответ

0

Вы всегда можете получить доступ к глобальному operator new с использованием синтаксиса

return ::operator new(sizeof Child); 

Примечания унарного оператора сферы. Этот синтаксис игнорирует любые члены класса и пространства имен и будет работать либо в Base::operator new, либо в Child::operator new.

Чтобы выделить и инициализировать объект без использования членов класса/пространства имен, используйте

::new Child 

Помимо этого ... да, член operator new обычно серьезный код запах.

+0

Я бы рекомендовал позвонить 'operator new'. –

+0

@LucDanton Да, поймал, что вскоре после повторного чтения. Разум не на полную скорость, но, видимо. Также это вонючее. – Potatoswatter

+0

@Potatoswatter: Спасибо! :) Это то, что я хотел. Я посмотрю другие ссылки, потому что это действительно вонючая вещь. :) –

2

Это не правильный дизайн. Предполагается, что функция 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(/*...*/); 
    // ... 
}; 

Затем в исходном файле: (. Обратите внимание, что частный operator new не полностью запретить клиентский код с помощью оператора new, так как всегда можно написать ::new Base)

class Child : public Base 
{ 
    // ... 
}; 

Base* Base::create(/*...*/) 
{ 
    return ::new Child(/*...*/); 
} 

За исключением объявления приватного operator new для запрета прямого распределения, использование только operator new членов i s для распределения экземпляров из определенного пула ; в этом случае вам также нужен член operator delete , чтобы освободить их в пул.

+0

О, я вижу. Похоже, я неправильно истолковал, для чего это. –

Смежные вопросы