2015-05-09 5 views
2

Я пробуя ковариаитиий тип возврата и следующий кодКовариантного возвращаемого типа ошибка недопустимого преобразования

class Base 
{ 
public: 
    virtual Base* clone() const 
    { 
     cout << "this is from Base " << endl; 
     return new Base(*this); 
    } 
}; 

class Derived : public Base 
{ 
public: 
    virtual Derived* clone() const 
    { 
     cout << "this is from Derived " << endl; 
     return new Derived(*this); 
    } 
}; 

int main() 
{ 
    Base* d = new Derived; 
    Derived* d2 = d->clone(); // invalid conversion from ‘Base*’ to ‘Derived*’ 
    return 0; 
} 

Почему линия Derived* d2 = d->clone(); дает недопустимую ошибку преобразования, так как тип Derived *, что clone возвращается в класс Derived? Если я изменю его на Base* d2 = d->clone();, он запустится, но он также распечатает «это из производного», указывая, что это clone в названии Derived.

+0

'.clone()': вставить java в C++ ... ошибка: недопустимый аргумент ... ошибка: вставить C++ в java ... ошибка: неверный аргумент ... – bolov

+0

повторный вопрос http://stackoverflow.com/q/29179035/3270926 – Youssef

+0

@ Юссф: Не совсем, нет. –

ответ

4

Проблема здесь:

Derived* d2 = d->clone(); 

Компилятор проверяет типы на тип компиляции, и d имеет тип Base* (даже если во время выполнения виртуальных пинки отправки в и действительно Derived* объект возвращается из d->clone()) , В вашем случае это нормально, чтобы использовать static_cast (нет необходимости в dynamic_cast на самом деле), как

Derived* d2 = static_cast<Derived*>(d)->clone(); 

Я думаю, что все из нас запутался по этому вопросу, по крайней мере один раз. Связано: Covariant clone function misunderstanding.

Смежные вопросы