2014-02-19 7 views
0

я получаю следующее сообщение об ошибке:Создание производного класса от базового

conversion from ‘BaseClass’ to non-scalar type ‘DerivedClass’ requested 

при компиляции что-то вроде:

AnotherClass response; 
DerivedClass message = response.serialize(QString("someStuff")); 

где я

BaseClass AnotherClass::serialize(const QString& valueName) const 

и

class DerivedClass : public BaseClass 
{ 
    ... 
    DerivedClass &operator=(const BaseClass &other); 
} 

Может кто-нибудь объяснить, что здесь не так, и что еще более важно почему?

ответ

3
DerivedClass message = response.serialize(QString("someStuff")); 

Это копия инициализация, не уступка, а operator= даже не приходит в игре.

Вы либо нужен конструктор, который принимает BaseClass или записать его так:

AnotherClass response; 
DerivedClass message; 
message = response.serialize(QString("someStuff")); // assignment 
+0

Правильно, я только что понял из оператора =. И это вопрос инициализации копирования, а не назначения. +1 –

0

Помимо использования копий инициализации, а не присваивание, как вы думаете, вы также нарушающую rule of three/four.

Правило гласит, что если у вас есть любой из ниже, вы должны все из них (либо реализованы или удалены с помощью Q_DECL_EQ_DELETE):

  1. деструктор

  2. конструктор копирования

  3. Переместить конструктор (для C++ 11)

  4. Оператор присваивания

Например, предположим, что вы не хотите, чтобы осуществить назначение. Вы должны иметь:

class MyClass { 
    // private, deleted - compatible with both C++11 and C++98/03. 
    MyClass & operator=(const MyClass &) Q_DECL_EQ_DELETE; 
public: 
    MyClass(const MyClass &); 
    MyClass(MyClass &&); 
    virtual ~MyClass(); 
    ... 
}; 
Смежные вопросы