Оператор размещения новый поиск - PullRequest
0 голосов
/ 18 июня 2019

Я очень новичок в C ++ и был сбит с толку следующим примером:

#include <iostream>
#include <cstddef>
#include <cstdlib>

class Test{
public:
    enum test_type{ test1 = 0, test2, test3};
    void *operator new(size_t sz, test_type t){
        return malloc(sz);
    }
};

class SomeClass: public Test{
public:
    SomeClass(int a): a(a){}
    int a;
};

int main(int argc, char ** argv){
    SomeClass *sc = new(Test::test1) SomeClass(10);
    std::cout << sc->a << std::endl;
}

DEMO

Я прочитал правила поиска имен на странице cpp-reference , но не нашел объяснения, почему оператор new, определенный в базовом классе, был найден и использован для производного класса (который может содержать дополнительный член).

Это обычный способ объявить operator new в базовом классе, а затем использовать его для выделения памяти для производных классов (идея была взята из какого-то проекта с открытым исходным кодом, написанного на C ++)?

1 Ответ

4 голосов
/ 18 июня 2019

Функция выделения operator new "ищется в области видимости" создаваемого класса, в данном случае SomeClass. Когда вы ищете имя в области видимости класса, оно может найти имя как член базового класса. Вот что происходит в этом случае.

Возможно, вам интересно, почему поиск operator new не использует какое-то специальное правило, которое исключает членов базового класса из рассмотрения. Ну, я думаю, что в некоторых случаях использование базового класса operator new имеет смысл. Тот факт, что производный класс может содержать дополнительный член, сам по себе не вызывает проблемы, поскольку язык передаст размер производного класса operator new, гарантируя, что он знает, сколько памяти он должен быть выделен для объекта производного класса. А использование базового класса operator new позволяет вводить указанный оператор из базового класса CRTP или просто предоставлять удобный способ распределения производных классов из одного и того же пула.

...