16

仮想削除演算子を持つことは可能ですか? 私はデストラクタについて話しているのではなく、実際の演算子のオーバーロードを意味します。

new と delete をオーバーロードすることは (ほとんどの場合) 非常に悪い考えであるという事実を差し引いて (はい、それが異端であることは既に知っています)、仮想削除演算子を使用することでどのような影響が生じるかを知りたいです。

仮想削除を使用しようと考えています。基本クラスのポインターに格納された削除をオーバーロードする子クラスがある場合があるためです。技術的には、異なるノードタイプのツリーを持っていない限り、このケースがあまり実を結ぶことはありません (そもそも潜在的に危険な考えです)。

仮想または非仮想の削除演算子のオーバーライドの潜在的な長所と短所を知りたいだけです。

4

4 に答える 4

17

operator deleteとして明示的に宣言することはできませんvirtual

キーワードを指定しなくても、これは静的メンバー関数ですstatic

しかし、最も派生したクラスで定義されたものが使用されるという意味で、operator delete すでに仮想です。デストラクタによって呼び出されたかのように考えることができます。そうかもしれません。;-)


C++11 §12.4/12 :
「仮想デストラクタの定義 (暗黙の定義 (12.8) を含む) の時点で、非配列解放関数がデストラクタのクラス (10.2) のスコープで検索され、 、宣言が見つからない場合、関数はグローバルスコープで検索されます。」


C++11 §12.5/4 :
削除式が単項演算子で始まる場合::、解放関数の名前はグローバル スコープで検索されます。それ以外の場合、静的型が仮想デストラクタを持つクラス オブジェクトの割り当てを解除するために削除式が使用される場合、解放関数は、動的型の仮想デストラクタの定義の時点で選択されたものです (12.4)。117それ以外の場合、delete 式を使用してクラスTまたはその配列のオブジェクトの割り当てを解除する場合、オブジェクトの静的型と動的型は同一である必要があり、解放関数の名前はのスコープで検索されます。T. この検索で​​名前が見つからない場合、その名前はグローバル スコープで検索されます。ルックアップの結果があいまいまたはアクセスできない場合、またはルックアップで配置解放関数が選択された場合、プログラムの形式が正しくありません。」

于 2012-12-16T00:17:32.580 に答える
7

いいえ - そのようにマークしなくても、クラスに対してnew/をオーバーロードする場合/場合、それらは静的メンバー関数1になり、静的メンバー関数は仮想にすることはできません。delete

機能するには、それらは本当に静的である必要があります-オブジェクトのメモリを割り当て/解放するために使用されるため、オブジェクトの構築が開始される前/破壊が終了した後に発生する必要があります。最終的にクラスのインスタンスになるものにメモリを割り当てさせることはできず、同時に、それがすでにクラスのインスタンスであることに依存させることはできません仮想関数が行います)。


  1. §12.5/1:

クラス T のすべての割り当て関数は、(明示的に static と宣言されていなくても) 静的メンバーです。

および§12.5/6:

クラス X のすべての割り当て解除関数は、静的メンバーです (明示的に static と宣言されていなくても)。

...公式声明を気にする人のために。割り当てているときは「クラス T」であり、解放しているときは「クラス X」であることが興味深いです。

于 2012-12-16T00:17:21.103 に答える
4

いいえ-仮想演算子を削除することはできません-クラス固有newであり、deleteオーバーロードは静的メンバー関数でなければなりません-オブジェクトではなくクラスに固有です。

仮想静的メンバー関数を持つことはできません。

標準のセクション 12.5.7 を参照してください。このセクションには、「メンバーの割り当てと割り当て解除の関数は静的であるため、仮想にすることはできません」と記載されています。

于 2012-12-16T00:21:25.943 に答える
-2

1)はい、もちろん削除をオーバーロードできます。いいえ、オーバーロードを仮想関数にすることはできません。

2)「長所と短所」は、何をしようとしているのかによって完全に異なります。

3) もちろん、演算子のオーバーロードの全体的な考え方 (C++ の多くの場合と同様) は、間違いなく愚かで、不必要で、危険です。

SOOOOOO .....

4) 必要ない場合は、実行しないでください :)

私見では...

于 2012-12-16T00:17:09.417 に答える