問題

これに似たSOの質問がたくさんありますが、私が探していたものを正確に見つけることができませんでした。これが重複している場合は申し訳ありません。

私はParentクラスとそれを継承する2つの派生クラスを持っています:

 class Son : public Parent { ... };
class Daughter : public Parent { ... };
 

次に、2つのshared_ptrをBaseクラスに宣言し、それぞれの派生クラスにshared_ptrでインスタンス化します。

 shared_ptr<Parent> son = shared_ptr<Son>(new Son());
shared_ptr<Parent> daughter = shared_ptr<Daughter>(new Daughter());
 

最後に、それが指す派生クラスのどれに基づいてshared_ptr<Parent>を処理するクラスが必要です。この効果を達成するために関数のオーバーロードを使用できますか?

 class Director {
public:
    void process(shared_ptr<Son> son);
    void process(shared_ptr<Daughter> daughter);
    ...
};
 

だから私は次のコードを書くことができるようにしたい:

 shared_ptr<Parent> son = shared_ptr<Son>(new Son());
shared_ptr<Parent> daughter = shared_ptr<Daughter>(new Daughter());
Director director;
director.process(son);
director.process(daughter);
 

今私はしなければならない(私は避けたい):

 director.process_son(boost::shared_polymorphic_downcast<Son>(son));
director.process_daughter(boost::shared_polymorphic_downcast<Daughter>(daughter));
 

  ベストアンサー

そのようにオーバーロードすることはできません。Directorの1つのメソッド内でディスパッチと同様のことを実現するには、switch文が必要です。

たぶん、process()メソッドをParentクラスに移動する必要があります(SonDaughterでオーバーライドします)。正しいものを呼び出すために通常の仮想関数解像度を使用できます。

  同じタグがついた質問を見る

c++inheritancepolymorphismoverloadingshared-ptr