2009-08-20 5 views
1

にオブジェクト同一性を決定します。内部的には、シンクへのポインタをstd :: setに格納したいと思います。シンクが登録されていないとき、私は単に私のセット内のポインタを検索し、それを削除します。私の質問は、何らかの方法で、同じオブジェクトがパラメータとして渡されたにもかかわらず、パラメータSinkのアドレスをとると結果が異なることになります。私は知っている、そのポインタは、特定の複数の継承szenariosでキャストするときに変更することができますが、この状況についてはどうですか?私は関数の次の対を有する参照からスーパー

ありがとうございます!あなたが言ったように、多重継承と仮想クラス間のキャスト時に

答えて

1

多重継承の場合は、「同じオブジェクト」の意味は、時には明らかにされていません。 ISINKは、基底クラスのリストに二回存在し、「仮想」で継承されていなかった場合 は例えば、このような状況は可能です。この場合、Fは

class A {}; 
class B:public A {}; 
class C:public A {}; 
class D:public B,public C {}; 
... 
void f(A *a); 
... 
{ 
    D d; 
    f(static_cast<B*>(&d)); 
    f(static_cast<C*>(&d)); 
} 

は、2つの異なるアドレスを取得します。 同じオブジェクトかどうかは、おそらくコンテキストに依存します。 あなたが助けるかもしれvoid *にdynamic_casting、同じオブジェクトとしてそれらを扱いたい場合は - (Aにおける仮想何かが、もちろん、必要とされている)

それが最も派生クラスにカースト
8

は、ポインタアドレスが変更されることがあります。しかし、あなたの場合、静的型は常に同じです:ISinkこの静的型の2つの点を比較することは安全であることが保証され、再現性のある結果が得られます。

2

複数の継承の場合にオフセット調整が行われます。 IFAIKを使用すると、オブジェクトがISinkから何回も継承され、ISinkがすべての場合に仮想基本クラスではない場合は、std :: less>を除いて等しいと並べ替え可能なポインタに移動する必要があります。

関連する問題