抽象类中的c ++ clone函数

Thu*_*ing 2 c++ inheritance clone c++11

在c ++ 11标准中,如果B类继承自A类,那么'B是A'.但是,我仍然对这个概念感到困惑:看看这段代码:

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

class Derived : public Base {
public:
    virtual Base* clone() const {
        return new Derived(*this);
    }
    //<more functions>
};
Run Code Online (Sandbox Code Playgroud)

我们从Derived返回了指向Base的指针,但是如果在此代码中使用此方法:

Derived* d1 = new Derived();
Derived* d2 = d1->clone();
Run Code Online (Sandbox Code Playgroud)

我们所做的是分配Base*Derived*!

问题:
为什么这段代码不能编译?为了适应继承,它怎么能被修改(以及为什么?)?

iam*_*ind 11

您发布的代码即使经过一些微不足道的编辑(我所做的)也无法编译.签名Derived::clone()应该是:

virtual Derived* clone() const override {  // <-- return type
  return new Derived(*this);
}
Run Code Online (Sandbox Code Playgroud)

即使clone()in BaseDerivedclass 的返回类型不同,它也是一个有效的覆盖virtual函数,因为共同方差在C++中是合法的.

当您处理问题中所述的指针时,不会有任何切片.
Derived::clone()应该回来Derived*.

是否clone()应该virtual取决于设计,但使用virtual析构函数,这是一个好主意.


另一种方法是使用a template并避免virtual:

class Base {
public: 
    virtual ~Base() {}
    template<class T>  // now need not add this trivial code in all derived classes
    T* clone() const { return new T(*this); }
};
Run Code Online (Sandbox Code Playgroud)