15

基底クラスの使用に問題があり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
     }

};
4

4 に答える 4

19

boost::shared_ptr で static_cast を参照してください。

適切なインスタンス化を取得するには、 dynamic_pointer_castを使用する必要があります。shared_ptr(に対応dynamic_cast)

于 2010-11-25T13:59:05.297 に答える
4

共有ポインタかどうかに関係なく、 へのポインタがある場合、Baseからのみメンバー関数を呼び出すことができますBase

本当に必要な場合はfrom boostdynamic_castを使用できますが、そうすべきではない可能性があります。代わりに、あなたの設計について考えてください :は aであり、これは非常に強い関係です。そのため、インターフェースについて、また具象型を本当に知る必要があるかどうかについて慎重に検討してください。dynamic_pointer_castDerivedBaseBase

于 2010-11-25T14:04:34.427 に答える
1

派生メソッドが基底クラス (virtual または not) で宣言されていない場合、コンパイルが失敗するのは正常です。共有 ptr は (それが保持するポインターを通じて) 基本クラスを認識して使用しますが、派生クラスとその特定のメソッドについては何も認識しません。

于 2010-11-25T13:58:10.300 に答える
0

あなたのコードは、生のポインターでも機能しません。

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

于 2010-11-25T14:01:41.267 に答える