2010-11-25 8 views
13

shared_ptrの基本クラスを使用しているときに、逆参照するときに派生クラスのメソッドを呼び出すことができないようです。私は、コードは私よりもより冗長になると信じて:boost :: shared_ptrと動的キャスト

class Base : public boost::enable_shared_from_this<Base> 
{ 
    public: 
    typedef boost::shared_ptr<BabelNet> pointer; 
}; 

class Derived : public Base 
{ 
    public: 
    static pointer create() 
       { 
         return pointer(new Derived); 
       } 
    void    anyMethod() 
    { 
     Base::pointer foo = Derived::create(); 
     // I can't call any method of Derived with foo 
     // How can I manage to do this ? 
     // is dynamic_cast a valid answer ? 
     foo->derivedMethod(); // -> compilation fail 
    } 

}; 
+1

あなたのサンプルがコンパイル可能であっても、もちろん批判的な行がコメントされている場合に役立ちます。 –

答えて

18

は、あなたが適切なshared_ptrインスタンス化を得るためにdynamic_pointer_castを使用する必要がありますstatic_cast with boost::shared_ptr?

を参照してください。 (dynamic_castに対応)

+1

どうして 'static_pointer_cast'はありませんか?私はおそらく、実際のコードを表すものではないかもしれないが、この例では、オブジェクトがターゲット型であるため、動的キャストは必要なく、いずれのクラスも仮想関数を持たないので、 。 –

+0

実際に投稿のタイトルのために 'dynamic_pointer_cast'を入れました。しかし、彼のコードでは、 'static_pointer_cast'が行います。 – lijie

+0

あなたのおかげで、私は興味深い記事を見つけました:http://nealabq.com/blog/2008/11/26/pointer_cast/ derived_classにshared_ptrを使用するだけで、shared_ptrとして渡すことができます基本クラス、きちんとした。 – HolyLa

1

derivedMethodは、(仮想またはしない)基底クラス内で宣言されていない場合、コンパイルが失敗することは正常です。共有ptrは、(それが保持するポインタを介して)基底クラスを認識して使用し、派生クラスとその固有のメソッドについては何も知らない。

+0

ポインタが派生クラスのtypedefであった場合、外部クラスがBase :: pointerについてしか知ることができないようにアップキャストできますか? – HolyLa

0

未加工のポインタでもコードが機能しません。

derivedMethod()メソッドは、基本クラスでも宣言するか、またはDerivedオブジェクトへのポインタを持つ必要があります。

4

共有ポインタまたはそうでない場合は、Baseへのポインタがある場合、メンバー関数はBaseからのみ呼び出すことができます。

実際にdynamic_castが必要な場合は、dynamic_pointer_castからboostまでを使用できますが、そうしないでください。代わりに、あなたのデザインについて考えてみてください:DerivedBaseです。これは非常に強い関係ですので、Baseインターフェイスについて慎重に考えてください。具体的なタイプを本当に知っていなければなりません。

関連する問題