6

我有以下类关系。我想克隆派生类,但我收到错误“无法实例化抽象类”。如何克隆派生类?谢谢。

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 的界面才能进行克隆。首先,删除virtual 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 回答