С++ Виртуальный оператор удаляет? - программирование

С++ Виртуальный оператор удаляет?

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

Минус в том, что он (в большинстве случаев) имеет большую плохую идею, чтобы перегружать новые и удалять (да, я уже знаю это ересь), я хочу знать, какие последствия возникают из-за использования виртуального оператора удаления.

Я думаю о попытке использовать виртуальное удаление, так как иногда у меня может быть дочерний класс, который перегружает delete, хранящийся в указателе базового класса. Технически я на самом деле никогда не видел, чтобы этот случай приносил слишком много результатов, если у меня нет дерева разных типов node (потенциально опасная идея, если вы спросите меня).

Я просто хочу знать, какие потенциальные плюсы и минусы виртуального или не виртуального, отменяет оператор delete.

4b9b3361

Ответ 1

Вы можете < t явно объявить operator delete как virtual.

Это статическая функция-член, даже если вы не указываете ключевое слово static.

Но operator delete уже является виртуальным в том смысле, что используется тот, который определен в самом производном классе. Вы можете подумать об этом, как если бы он вызвал деструктор. Это может быть даже так.; -)


С++ 11 §12.4/12:
"В точке определения виртуального деструктора (включая неявное определение (12.8)), не-массив функция освобождения рассматривается в классе деструкторов (10.2), и, если никакое объявление не является найден, функция просматривается в глобальном масштабе."


С++ 11 §12.5/4:
"Если выражение-выражение начинается с унарного оператора ::, имя функции удаления используется в глобальный охват. В противном случае, если выражение delete используется для освобождения объекта класса, статический тип которого виртуальный деструктор, функция освобождения является той, которая выбрана в точке определения динамического type virtual destructor (12.4). 117 В противном случае, если выражение-выражение используется для освобождения объекта class T или его массив, статические и динамические типы объекта должны быть идентичными и освобождение имя функции отображается в области T. Если этот поиск не находит имя, имя просматривается в глобальный охват. Если результат поиска неоднозначен или недоступен, или если поиск выбирает место размещения функция освобождения, программа плохо сформирована".

Ответ 2

Нет - даже если вы не отмечаете это как таковое, когда/если вы перегружаете new/delete для класса, они заканчиваются как статические функции-члены 1 и статические функции-члены не могут быть виртуальными.

Чтобы работать, они действительно должны быть статичными - они используются для выделения/освобождения памяти для объекта, поэтому должны произойти до того, как объект начнет строительство/после завершения уничтожения. Вы явно не можете выделить память для того, что в конечном итоге станет экземпляром класса, и в то же время зависеть от того, что уже является экземпляром класса (что делает виртуальная функция).


  • §12.5/1:

Любая функция распределения для класса T является статическим членом (даже если явно не объявлено статическим).

и §12.5/6:

Любая функция освобождения для класса X является статическим членом (даже если явно не объявлено статическим).

... для всех, кто интересуется официальными заявлениями. Интересно, как это "класс T" при распределении, и "класс X", когда вы освобождаетесь.

Ответ 3

Нет - вы не можете иметь виртуальный оператор delete - class-specific new и delete перегрузки должны быть статическими функциями-членами, специфичными для класса, а не для объекта.

У вас нет виртуальных статических функций-членов.

См. раздел 12.5.7 стандарта, в котором говорится: "Поскольку функции распределения и освобождения членов являются статическими, они не могут быть виртуальными".

Ответ 4

1) Да, конечно, вы можете перегрузить удаление. Нет, перегрузка не может быть виртуальной функцией.

2) "За и против" зависит полностью от того, что вы пытаетесь сделать.

3) Конечно, вся идея перегрузки оператора - как и в С++, - это, возможно, глупо, ненужно и опасно.

SOOOOOO.....

4) Если вам НЕ НРАВИТСЯ, то не делайте этого:)

ИМХО...