-1

私はSOを少し検索しましたが、私の問題に正しく答えるものを見つけることができませんでした(これこれ、およびこれを読みました)

現在、ポリモーフィズムでスマート ポインターを使用しようとしています。

実装へのポインターを使用して抽象クラスへのスマートポインターを作成しようとすると、次のようになります。

std::shared_ptr<Abstract> ptr = std::make_shared(new Implementation);

私のコンパイラ (MSVC2012) はAbstract、 へのポインタを作成しようとしても、純粋な仮想があるためインスタンスを作成できないというエラーを表示しますImplementation

この場合、スマート ポインターを完全に間違って使用している可能性がありますが、何が間違っていたのかわかりません (そして、Visual Studio は、私が言及した行に下線を引きません)。

それでは、ポリモーフィズムが必要なときにスマート ポインターを使用できるかどうか、もしそうなら、どのようにそれを行う必要があるか疑問に思います。

注 : 共分散と、shared_ptr がshared_ptr を継承する型ではないという事実は知っていますが、スマート ポインターがこれを処理すると考えていました。

編集 :

要求どおり、実際のコード行は次のとおりです。

std::shared_ptr<ISpectrometer> ret = std::make_shared<OOSpectrometer>(m_spectroWrapper);

これによりOOSpectrometer、抽象クラスISpectrometer(および m_spectroWrapper の単純なパラメーター) から継承されます。

MSVC が表示するエラー (フランス語なので、英語のメッセージとは異なる可能性があります) は次のとおりです。

error C2259: OOSpectrometer : can't instantiate an abstract class due to the following members :

そして、 にある純粋仮想関数を一覧表示しますISpectrometer

4

2 に答える 2

7

std::shared_ptr問題は、ポリモーフィズムに関しての動作が壊れていることではなく、このエラー メッセージは非常に明確です。

エラー C2259: OOSpectrometer: 次のメンバーのため、抽象クラスをインスタンス化できません:

このクラスOOSpectrometerは抽象的であるため、インスタンス化できません。ISpectrometerほとんどの場合、インターフェイスで定義されているすべての純粋仮想関数を実装しているわけではありません。

また、オーバーライドされない純粋な仮想メンバー関数のリストは、OOSpectrometer取得しているエラー メッセージの一部である必要があります (" due to the following members: ... ")。

于 2013-05-15T13:36:38.290 に答える
2

エラーメッセージが示すように、問題はそれOOSpectrometerがまだ抽象的であることであり、抽象基本クラスをインスタンス化しようとしているということではありません。

で宣言されているすべての純粋仮想関数を正しくオーバーライドしたことを確認してくださいISpectrometer。特にエラーメッセージにリストされているもの。

于 2013-05-15T13:36:51.083 に答える