2016-09-13 8 views
-2

私はインターネット上のいたる所を探していて、次の問題にまともな答えが見つかりませんでした。 コード:静的型として基本クラスを持つ変数に派生クラスを保存する

class P { 
public: 
    virtual void play() = 0;  
}; 

class A: public P { 
    public: 
    void play() { }; 
}; 

P myVar= A(); 

は、最後の行はエラー以下与える:抽象型のオブジェクトを割り当てることができない「歌」、クラスAは、遊び()オーバーライド

が - の方法を、私はオブジェクトを割り当てていますPの代わりにクラスAの、私はここで間違って何ですか?

+5

* C++はJavaではありません。* – Brian

+1

'PとmyVar = A();'を試してください。 –

+1

@Brianそれから、ちょうど役に立たない言葉で周囲を飛び回るのではなく、答えを出してください... – Domien

答えて

2

問題は、あなたがPにオブジェクトをコピーしてAで追加の実装をslices offオブジェクトP myVarをしようとしているということです。

"値"オブジェクトを使用してこれを行うことはできません。そのためのポインタまたは参照が必要です。組み込みのC++のポインタに基づいたソリューションは、次のようになります。

P *myPtrVar = new A(); 
... // Use myPtrVar here 
delete myPtrVar; 

スマートポアントに基づくソリューションは、次のようになります。

std::unique_ptr<P> mySmartPtrVar(new A()); 

smart pointersを使用する利点は、あなたが呼び出す必要はありませんということですdeletemySmartPtrVarが有効範囲外になるとすぐにオブジェクトの割り当てが解除されます。

+0

ありがとうございました。私は可能な限りポインタを避けたいですが。 – Domien

+0

@Domien参照も使用できます。しかし、あなたが知っているコンセプトをJavaからC++に "マップ"しようとするならば、Javaの非プリミティブはすべてC++のポインタに対応するでしょう。 – dasblinkenlight

関連する問題