наследовать оператор новый от базового класса - PullRequest
2 голосов
/ 16 января 2011

На этой странице (из C ++ в книге действий) показан код:

class Link
{
    friend class FreeList;
public:
    Link (Link * pNext, int id)
    : _pNext (pNext), _id (id) {}

    Link *  Next () const { return _pNext; }
    int     Id () const { return _id; }
    // allocator
    void * operator new (size_t size)
    {
        assert (size == sizeof (Link));
        return _freeList.NewLink ();
    }
    void operator delete (void * mem)
    {
        if (mem)
            _freeList.Recycle (mem);
    }
    static void Purge () { _freeList.Purge (); }
private:
    static    FreeList _freeList;

    Link *  _pNext;
    int     _id;
};

А затем произнесите

Класс Link имеет статический член _freeList, которыйиспользуется перегруженными специфичными для класса операторами new и delete.Обратите внимание на утверждение в операторе new.Это защищает нас от кого-то, вызывающего этот конкретный оператор для другого класса.Как это могло случиться? Операторы new и delete наследуются.Если класс, производный от Link, не переопределяет эти операторы, new, вызванный для производного класса, вернет объект неправильного размера (размер базового класса).

Это утверждение верно?Я думаю, что новый будет вызываться с правильным размером производного объекта.Почему нет?

Ответы [ 2 ]

9 голосов
/ 16 января 2011
Выражение

A new вызовет функцию распределения (operator new) с правильным размером для строящегося объекта. Вот для чего size_t параметр для operator new.

Тем не менее, конкретная реализация operator new в этом примере может справиться только с запросами распределения одинакового размера. Если производный класс не переопределит operator new , эта реализация из operator new будет вызвана с размером, с которым она не может справиться (иначе "неправильно").

В общем, вполне возможно написать operator new для класса, который может обрабатывать запросы выделения для производных классов.

0 голосов
/ 16 января 2011

если у производного класса нет элементов данных, то я думаю, sizeof (производная) == sizeof (ссылка) и утверждение в операторе new в Link не потерпит неудачу.

class derived : public Link {};

derived* d = new derived(); //should call Link's op new 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...