2014-02-19 68 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. 拷贝构造函数移动构造函数(用于C++ 11)

  3. 赋值运算符

例如,假设您不想执行任务。你应该有:

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(); 
    ... 
};