使用纯虚方法克隆C ++类

时间:2012-05-14 15:56:19

标签: c++ virtual

我有以下类的关系。我想克隆类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 个答案:

答案 0 :(得分: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);
    }
};

答案 1 :(得分:4)

您无法实例化具有纯虚函数的类:

virtual void yourFunction() = 0

创建一个子类或删除它。

答案 2 :(得分:2)

只能实习具体课程。 Func应该不纯粹。

答案 3 :(得分:0)

我可能在这里说一些愚蠢的东西,但我认为派生类中的clone方法仍应返回指向基类的指针。也许它仍然编译得很好,但就代码的可维护性而言,我认为最好只使用方法clone来返回指向基类的指针。毕竟,如果你的派生类必须克隆到指向派生类的指针,你也可以这样做

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

当然,您需要实现复制构造函数,但通常应该实现(除极端情况外)。

相关问题