6

私はクラスの次の関係を持っています。Derived クラスのクローンを作成したいのですが、「抽象クラスをインスタンス化できません」というエラーが表示されます。派生クラスを複製するにはどうすればよいですか? ありがとう。

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);
    }
};
4

4 に答える 4

7

インスタンス化できるのは具象クラスのみです。クローンを作成するには、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);
    }
};
于 2012-05-14T16:05:04.657 に答える
4

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

virtual void yourFunction() = 0

サブクラスを作成するか、削除してください。

于 2012-05-14T15:57:56.470 に答える
2

インスタンス化できるのは具象クラスのみです。Func は純粋であってはなりません。

于 2012-05-14T15:57:52.930 に答える
0

ここでばかげたことを言っているかもしれませんが、派生クラスのクローン メソッドは基本クラスへのポインターを返す必要があると思います。それでも問題なくコンパイルできるかもしれませんが、コードの保守性に関する限り、メソッド clone は基本クラスへのポインターを返すためだけに使用する方がよいと思います。結局のところ、派生クラスが派生クラスへのポインターに複製する必要がある場合は、そのまま実行することもできます

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

もちろん、コピー コンストラクターを実装する必要がありますが、通常はとにかく実装する必要があります (極端な場合を除く)。

于 2012-05-15T07:30:09.437 に答える