Я нашел этот вопрос, задающий тот же вещь, однако был дан ответ только на «новую» часть, так что снова.
Почему оператор удаления должен быть статическим? Как-то не имеет смысла. Новый оператор имеет смысл, точно так же, как конструктор не может быть виртуальным, так же как и новый оператор. Однако деструктор может (и должен) быть виртуальным, когда вы используете наследование, чтобы разрешить уничтожение объектов, используемых (посредством полиморфизма) в качестве базового класса.
Я понимаю, что когда вызывается оператор удаления, объект уже уничтожен, поэтому «этого» не существует. Тем не менее, по тем же соображениям, что и в случае с виртуальным деструктором, по-прежнему имеет смысл, чтобы оператор удаления соответствовал оператору нового, создавшему объект.
Это то, что я имею в виду
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
void* operator new (size_t sz);
void operator delete (void* ptr, size_t sz);
};
теперь, если мы сделаем
A *ptr = new B();
delete ptr; // <-- fail
Оператор удаления A (по умолчанию) должен был быть вызван, поскольку он статичен и во время компиляции неизвестно (ни для чего, кроме тривиального случая), какой оператор удаления является правильным.
Тем не менее, я сделал небольшую тестовую программу с приведенным выше кодом (просто malloc/free в операторах new/delete и оператор печати в delete) и скомпилировал ее с помощью g++. Его запуск совершенно неожиданно привел к выводу в операторе удаления B.
Мой (настоящий) вопрос заключается в следующем: есть ли какая-то неявная «виртуальность» в операторе удаления? Является ли он статическим только в смысле отсутствия этого указателя? Или это просто функция g++?
Я начал просматривать спецификацию C++, но, должен признать, я был немного ошеломлен ею, поэтому любая помощь ценна.