С++ Виртуальный оператор удаляет?
Возможно ли иметь виртуальный оператор удаления? Я не говорю деструктор, я имею в виду фактическую перегрузку оператора.
Минус в том, что он (в большинстве случаев) имеет большую плохую идею, чтобы перегружать новые и удалять (да, я уже знаю это ересь), я хочу знать, какие последствия возникают из-за использования виртуального оператора удаления.
Я думаю о попытке использовать виртуальное удаление, так как иногда у меня может быть дочерний класс, который перегружает delete, хранящийся в указателе базового класса. Технически я на самом деле никогда не видел, чтобы этот случай приносил слишком много результатов, если у меня нет дерева разных типов node (потенциально опасная идея, если вы спросите меня).
Я просто хочу знать, какие потенциальные плюсы и минусы виртуального или не виртуального, отменяет оператор delete.
Ответы
Ответ 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 и статические функции-члены не могут быть виртуальными.
Чтобы работать, они действительно должны быть статичными - они используются для выделения/освобождения памяти для объекта, поэтому должны произойти до того, как объект начнет строительство/после завершения уничтожения. Вы явно не можете выделить память для того, что в конечном итоге станет экземпляром класса, и в то же время зависеть от того, что уже является экземпляром класса (что делает виртуальная функция).
Любая функция распределения для класса T является статическим членом (даже если явно не объявлено статическим).
и §12.5/6:
Любая функция освобождения для класса X является статическим членом (даже если явно не объявлено статическим).
... для всех, кто интересуется официальными заявлениями. Интересно, как это "класс T" при распределении, и "класс X", когда вы освобождаетесь.
Ответ 3
Нет - вы не можете иметь виртуальный оператор delete - class-specific new
и delete
перегрузки должны быть статическими функциями-членами, специфичными для класса, а не для объекта.
У вас нет виртуальных статических функций-членов.
См. раздел 12.5.7 стандарта, в котором говорится: "Поскольку функции распределения и освобождения членов являются статическими, они не могут быть виртуальными".
Ответ 4
1) Да, конечно, вы можете перегрузить удаление. Нет, перегрузка не может быть виртуальной функцией.
2) "За и против" зависит полностью от того, что вы пытаетесь сделать.
3) Конечно, вся идея перегрузки оператора - как и в С++, - это, возможно, глупо, ненужно и опасно.
SOOOOOO.....
4) Если вам НЕ НРАВИТСЯ, то не делайте этого:)
ИМХО...