Я нашел этот один вопрос, задающий одно и то же,, однако была отреагирована только на "новую" часть, поэтому здесь идет снова.
Почему оператор удаления должен быть статическим? Как-то это не имеет смысла. Новый оператор имеет смысл, так же как конструктор не может быть виртуальным, и новый оператор не может быть. Однако деструктор может (и должен) быть виртуальным, когда вы используете наследование, чтобы разрешить уничтожение используемых объектов (посредством полиморфизма) в качестве базового класса.
Я понимаю, что, когда вызывается оператор delete, объект уже уничтожен, поэтому нет 'this'. Тем не менее, по-прежнему имеет смысл, используя те же рассуждения, что и с виртуальным деструктором, чтобы оператор удаления соответствовал новому оператору, который создал объект.
Это то, что я имею в виду
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
Должен был вызываться оператор удаления (по умолчанию), поскольку он статический и неизвестный (для чего-то, кроме тривиального случая здесь) во время компиляции, который является оператором delete-operator.
Тем не менее, я сделал небольшую тестовую программу с приведенным выше кодом (просто malloc/free в операторах new/delete и print statement в delete) и скомпилировал его с помощью g++. Запуск его довольно неожиданно произвел вывод в операторе удаления B.
Мой (реальный) вопрос: есть ли какая-то неявная "виртуальность" для оператора удаления? Является ли оно только статичным в смысле отсутствия этого указателя? Или это просто функция g++?
Я начал изучать спецификацию на С++, но должен признать, что я был немного ошеломлен этим, поэтому любая помощь была оценена.