почему компилятор жалуется, что не может инициализировать Derived с помощью rvalue типа Base

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

я компилирую вышеприведенный код в последней версии Xcode, и компилятор жалуется

cannot initialize a variable of type "Derived*" with an rvalue of type "Base*"*

at Derived *d2 = b->clone().

Но я уже делаю клон virtual и позволяю clone() в Derived возвращать Derived *.

Почему у меня до сих пор такая проблема?


person Sherwin    schedule 28.09.2015    source источник
comment
См. stackoverflow.com/questions/4665117/   -  person Pixelchemist    schedule 28.09.2015


Ответы (1)


Тип возвращаемого значения Base::clone()Base*, а не Derived*. Поскольку вы вызываете clone() через Base*, ожидаемое возвращаемое значение равно Base*.

Если вы вызываете clone() через Derived*, вы сможете использовать возвращаемый тип Derived::clone().

Derived *d = new Derived;
Derived *d2 = d->clone();   // OK

Также,

Base *b = d;
Derived *d2 = dynamic_cast<Derived*>(b->clone());  // OK

Также,

Base *b = d;
Derived *d2 = dynamic_cast<Derived*>(b)->clone();  // OK
person R Sahu    schedule 28.09.2015