从基创建派生类

Creating a derived class from a base

本文关键字:派生 创建      更新时间:2023-10-16

我收到以下错误消息:

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

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

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

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

你要么需要一个接受BaseClass的构造函数,要么像这样编写它:

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

除了使用复制初始化,而不是你认为的赋值,你还违反了三/四的规则。

规则是,如果您有以下任何一项,则必须拥有所有这些(使用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();
  ...
};