从基础创建派生类

时间:2014-02-19 09:38:46

标签: c++ qt

我收到以下错误消息:

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

有人可以解释这里有什么问题,更重要的是为什么

2 个答案:

答案 0 :(得分:3)

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

这是复制初始化,而非作业,operator=甚至没有发挥作用。

您需要一个采用BaseClass的构造函数或者像这样编写它:

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

答案 1 :(得分:0)

除了使用复制初始化,而不是您认为的任务,您也违反了rule of three/four

规则是,如果你有以下任何,你必须拥有所有(使用Q_DECL_EQ_DELETE实现或删除):

  1. 析构

  2. 复制构造函数

  3. 移动构造函数(适用于C ++ 11)

  4. 作业运营商

  5. 例如,假设您不想实现赋值。你应该:

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