class Base {
public:
virtual Base* clone() const { return new Base(*this); }
// ...
};
class Derived: public Base {
public:
Derived* clone() const override { return new Derived(*this); }
// ...
};
int main() {
Derived *d = new Derived;
Base *b = d;
Derived *d2 = b->clone();
delete d;
delete d2;
}
Run Code Online (Sandbox Code Playgroud)
我在最新版本的Xcode中编译上面的代码,编译器抱怨
cannot initialize a variable of type "Derived*" with an rvalue of type "Base*"*
Run Code Online (Sandbox Code Playgroud)
在Derived *d2 = b->clone().
但我已经克隆了,virtual并让clone()Derived返回Derived *.
为什么我还有这样的问题?
返回类型Base::clone()是Base*,而不是Derived*.由于您clone()通过a 调用Base*,因此预期的返回值为a Base*.
如果clone()通过a 调用Derived*,则可以使用返回类型Derived::clone().
Derived *d = new Derived;
Derived *d2 = d->clone(); // OK
Run Code Online (Sandbox Code Playgroud)
也,
Base *b = d;
Derived *d2 = dynamic_cast<Derived*>(b->clone()); // OK
Run Code Online (Sandbox Code Playgroud)
也,
Base *b = d;
Derived *d2 = dynamic_cast<Derived*>(b)->clone(); // OK
Run Code Online (Sandbox Code Playgroud)