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