基本クラスの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
}
};
static_cast with boost :: shared_ptr? を参照してください
適切なshared_ptr
インスタンス化を取得するには、 dynamic_pointer_cast を使用する必要があります。 (dynamic_cast
に対応)
共有ポインターであるかどうかにかかわらず、Base
へのポインターがある場合、メンバー関数を呼び出すことができるのはBase
からのみです。
本当にdynamic_cast
が必要な場合は、 boost からdynamic_pointer_cast
を使用できますが、そうすべきではない可能性があります。代わりに、あなたのデザインについて考えてください:Derived
はBase
であり、これは非常に強い関係なので、考えてみてくださいBase
インターフェイスについて注意深く、具体的なタイプを本当に知る必要があるかどうか。
派生メソッドが基本クラス(仮想かどうか)で宣言されていない場合、コンパイルが失敗するのは正常です。共有ptrは、(保持するポインターを介して)基本クラスを認識して使用し、派生クラスとその特定のメソッドについては何も知りません。
あなたのコードは生のポインタでも機能しません。
基本クラスでもderivedMethod()
メソッドを宣言するか、Derived
オブジェクトへのポインタを用意する必要があります。