newによって返されたのと同じポインタを渡す必要がありますか、それともクラスの基本型の1つへのポインタを渡すことができますか?例えば:
class Base
{
public:
virtual ~Base();
...
};
class IFoo
{
public:
virtual ~IFoo() {}
virtual void DoSomething() = 0;
};
class Bar : public Base, public IFoo
{
public:
virtual ~Bar();
void DoSomething();
...
};
Bar * pBar = new Bar;
IFoo * pFoo = pBar;
delete pFoo;
もちろん、これは大幅に簡略化されています。私が本当にやりたいのは、boost :: shared_ptrでいっぱいのコンテナーを作成し、それをコードに渡して、終了時にコンテナーから削除することです。このコードは、BarまたはBaseの実装について何も知らず、shared_ptrデストラクタの暗黙の削除演算子に依存して正しいことを行います。
これはおそらく機能しますか?ポインタが同じアドレスを持たないので、私の直感はノーと言います。一方、dynamic_cast <Bar *>は機能するはずなので、コンパイラはそれを理解するのに十分な情報をどこかに格納しています。
助けてくれてありがとう、答えてコメントしてくれたみんな。私の例に示されているように、仮想デストラクタの重要性はすでに知っていました。答えを見た後、私はそれを少し考えました、そして仮想デストラクタの全体の理由がこの正確なシナリオであることに気づきました。したがって、それは機能しなければなりませんでした。ポインタを元に戻すための目に見える手段がないことに私は投げ込まれました。もう少し考えてみると、目に見えない手段があると私は信じました。そして、デストラクタが削除から解放への真のポインタを返していると理論付けました。Microsoft VC ++からコンパイルされたコードを調査すると、〜Baseでこの行を見たときに、私の疑いが確認されました。
mov eax, DWORD PTR _this$[ebp]
アセンブラをトレースすると、これが削除関数に渡されているポインタであることがわかりました。謎が解けた。
I've fixed the example to add the virtual destructor to IFoo, it was a simple oversight. Thanks again to everyone who pointed it out.