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 Base和Derivedclass 的返回类型不同,它也是一个有效的覆盖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)