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

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

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

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

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

4 ответа

Решение

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

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

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


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


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

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

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


  1. §12.5 / 1:

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

и §12.5/6:

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

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

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

Вы не можете иметь виртуальные статические функции-члены.

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

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

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

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

СООООООО.....

4) Если вам НЕ НУЖНО это, то НЕ ДЕЛАЙТЕ ЭТОГО:)

ПО МОЕМУ МНЕНИЮ...

Другие вопросы по тегам