如何通过继承实现移动构造函数和移动赋值运算符(抽象基类)

时间:2019-01-11 19:43:14

标签: c++

The error message in Visual Studio I get 我正在学习c ++,想测试一下东西。 我使用Account(作为抽象基类)和JointAccount(具有从Account的公共继承)创建了一个帐户层次结构。 但是我不知道如何为JointAccount实现复制构造函数和复制赋值运算符。 我尝试了一些尝试,但没有成功。我搜索了,但没有明确的解释。

class Account : public Printable
{
protected:
    std::string* name;
    double balance;

public:
    Account(std::string name, double balance);
    Account(const Account& source);
    Account(Account&& source);
    virtual ~Account();
    Account& operator=(const Account& rhs);
    Account& operator=(Account&& rhs);
    .
    .
    .
    virtual void print(std::ostream& os) const override = 0;
};
Account::Account(Account&& source)
    :   name{source.name}, balance{source.balance}
{
    source.name = nullptr;
}

Account& Account::operator=(Account&& rhs)
{
    this->name = rhs.name;
    this->balance = rhs.balance;
    rhs.name = nullptr;
    return *this;
}
class JointAccount final : public Account
{
private:
    std::string* secondName;
public:
    JointAccount(std::string name, double balance, std::string secondName);
    JointAccount(const JointAccount& source);
    JointAccount(JointAccount&& source);
    virtual ~JointAccount();
    JointAccount& operator=(const JointAccount& rhs);
    JointAccount& operator=(JointAccount&& rhs);
    .
    .
    .
    virtual void print(std::ostream& os) const override;
};
I tried this but it does not work as Account is Abstract VVV

JointAccount::JointAccount(JointAccount&& source)
    :   Account{source}, secondName{source.secondName}
{
    ?
}

And as I can't figure out the move constructor, I also can't figure 
out how to do the move assignment operator VVV

JointAccount& JointAccount::operator=(JointAccount&& rhs)
{
    ?
}

1 个答案:

答案 0 :(得分:0)

以下是我认为您尝试正确编译的一个基本示例:https://coliru.stacked-crooked.com/a/8a5b64904f262b5a

我怀疑您的问题未能定义要声明为虚拟的函数。解决方案是确保定义了所有非纯虚拟方法。请注意,即使已将析构函数声明为纯虚拟的,也必须对其进行定义。

您尝试的基本结构似乎有效,因此您的问题似乎在实现的其他地方。