2012-05-14 16 views
5

私は以下のクラスの関係を持っています。クラスDerivedをクローンしたいですが、 "抽象クラスをインスタンス化できません"というエラーが出ます。どのように派生クラスをクローンすることができますか?ありがとう。純粋な仮想メソッドを使用したC++クラスのクローニング

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

class Derived: public Base { 
public: 
    virtual void func() = 0; 
    virtual Derived* clone() const { 
     return new Derived(*this); 
    } 
}; 
+0

これは何をしますか?クローンは基本的にオブジェクトレベルの操作です。具体的なオブジェクトがなければ、どのようにクローンを作るべきかを知っていますか? – Joe

答えて

2

具体的なクラスのみをインスタンス化できます。 Funcは純粋ではありません。

virtual void yourFunction() = 0 

は、サブクラスを作成したり、それを削除します。

4

次のような純粋仮想関数を持つクラスをインスタンス化することはできません。

+0

または実装を提供する – obmarg

6

具体的なクラスのみをインスタンス化できます。クローン作成を行うには、Derivedのインターフェースを再設計する必要があります。最初に、仮想void func()= 0を削除します。そして、あなたは、このコードを書くことができるようになります:

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

class Derived: public Base { 
public: 
    virtual Derived* clone() const { 
     return new Derived(*this); 
    } 
}; 

別の解決策は、インプレース純粋仮想関数を維持し、具体的なクラスを追加します

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

class Derived: public Base { 
public: 
    virtual void func() = 0; 
}; 

class Derived2: public Derived { 
public: 
    virtual void func() {}; 
    virtual Derived2* clone() const { 
     return new Derived2(*this); 
    } 
}; 
0

私はここに愚かな何かを言っているかもしれませんが、私は、派生クラスのクローンメソッドはまだ基本クラスへのポインタを返す必要があると思います。たぶんまだコンパイルされているかもしれませんが、コードの保守性に関しては、基本クラスへのポインタを返すためだけにメソッドのクローンを使う方が良いと思います。 (結局のところ、あなたの派生クラスが派生クラスへのポインタにクローン化するために持っている場合、あなたにもちょうどもちろん

Derived original; 
Derived* copy = new Derived(original) 

を行うことができ、あなたはコピーコンストラクタを実装する必要があるが、それは通常、とにかく実装する必要があります極端な場合を除く)。

関連する問題