为什么编译器抱怨无法使用类型为Base的rvalue初始化"Derived"

She*_*win 1 c++ derived-class

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 *.

为什么我还有这样的问题?

R S*_*ahu 5

返回类型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)