【问题标题】:Cloning C++ class with pure virtual methods使用纯虚方法克隆 C++ 类
【发布时间】:2012-05-14 15:56:19
【问题描述】:

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

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

【问题讨论】:

  • 这会做什么?克隆本质上是对象级操作。没有具体的对象,你怎么知道要克隆什么?

标签: c++ virtual


【解决方案1】:

只有具体的类可以被实例化。您必须重新设计 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);
    }
};

【讨论】:

    【解决方案2】:

    你不能像这样实例化一个具有纯虚函数的类:

    virtual void yourFunction() = 0
    

    创建一个子类或删除它。

    【讨论】:

      【解决方案3】:

      只能实例化具体类。 Func 不应该是纯的。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2015-03-24
          • 1970-01-01
          • 2011-09-08
          • 2015-03-27
          • 2011-06-24
          • 1970-01-01
          • 2012-10-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多