2012-03-15 5 views
1

可能な二重に仮想コンストラクタを使用してください:私はC++

はなぜ我々はC++での仮想コンストラクタを必要とされるだろう
Where virtual constructors are used?

C++では直接サポートしていませんが、この機能を有効にするいくつかのソリューションがあります。私はそのようなことが必要な時を知りたいと思います。

+0

[Factory Method Pattern](http://en.wikipedia.org/wiki/Factory_method_pattern)のような仮想コンストラクタ?あなたが参照しているコードの例を提供してください。 – Joe

+0

はい。プロトタイプパターンでも同様です。使用のシナリオを知りたい – vamsi

+1

http://stackoverflow.com/search?q=C%2B%2B+virtual+Constructor?また、あなたは何を達成しようとしていますか?仮想コンストラクタはかなり緩やかな用語です。 –

答えて

5

仮想コンストラクタは、オブジェクトが実際にどのような型であるか知らずにオブジェクトを複製する機能です。これは、実際のタイプのオブジェクトがわからないのにオブジェクトのコピーが必要な場合に非常に便利です。

class Object 
{ 
public: 
    Object() {}; 
    virtual ~Object(){} = 0; 
    virtual Object* clone() const = 0; 
}; 

そして、我々はそれから原料の束を導き出す:のは、私たちは以下のようなものをベースクラスがあるとしましょう今

class MyClass : public Object 
{ 
public: 
    MyClass() {}; 
    MyClass(const MyClass& rhs) {}; // copy-constructor 
    virtual ~MyClass() { }; 
    virtual MyClass* clone() const { return new MyClass(*this); }; // virtual ctor 
}; 

class AnotherClass : public Object { /* etc */ }; 

、我々はこれらのオブジェクトの派生クラスのベクトルを持っているとします

std::vector<Object*> objects; 
objects.push_back(new MyClass()); 
objects.push_back(new AnotherClass()); 

これで、ベクター内のすべてのオブジェクトのコピーを作成し、別のベクターに入れたいと思います。ここに私たちのクローンが入ってきます!

std::vector<Object*> anotherVector; 
for(std::vector<Object*>::const_iterator cit(objects.begin()); 
    cit != objects.end(); 
    ++cit) 
    anotherVector.push_back((*cit)->clone()); 

ように、オブジェクトの派生クラスがあり、実際どのようなタイプを知ることなしに、私たちは基本的にそれ自身のコピーコンストラクタを呼び出すclone()機能を介してそれらのコピーを作成することができます。

注:これは、仮想コンストラクタを使用する場合にのみ使用できます。あなたが何かをコピーし、その実際のクラスを知らないと思うかもしれない多くの時があります。

+1

+1これは仮想*コピー*コンストラクタであり、非常に具体的な使用方法です。 –

+0

このような状況での使用方法を理解しています。しかし、私の理解によれば、仮想は、(実行時のように)遅く決定されるものを意味します。したがって、仮想コンストラクタは、いくつかの入力パラメータに基づいて実行時にオブジェクトを構築することを意味します。例:ファクトリメソッドでは、実行時にいくつかのパラメータに基づいて派生クラスを作成します。それはまた、仮想コンストラクタの別のアプリケーションですか? – vamsi