当基类提供时,派生类是不是需要实现移动语义?

Posted

技术标签:

【中文标题】当基类提供时,派生类是不是需要实现移动语义?【英文标题】:Do derived classes need to implement move semantics when a base provides it?当基类提供时,派生类是否需要实现移动语义? 【发布时间】:2015-07-31 21:48:09 【问题描述】:

我读完了Thomas Becker's "C++ Rvalue References"。我有几个关于右值和右值引用的问题。

假设我有一个简单的数组类:

template <class T>
MyArray

    ...
    T* m_ptr;  // Pointer to elements
    size_t m_count; // Count of elements
;

进一步假设它提供:

#if(__cplusplus >= 201103L)
MyArray(MyArray&& t)
  : m_ptr(std::move(t.m_ptr)), m_count(std::move(t.m_count))

    t.m_ptr = NULL;
    t.m_count = 0;

MyArray operator=(MyArray&& t)

    std::swap(*this, t);
    return *this;

#endif

现在,假设我有一个添加新数据成员的派生类:

MyImprovedArray : public MyArray

    ...
;

MyImprovedArray 需要什么?

还需要MyImprovedArray(MyImprovedArray&amp;&amp;)MyImprovedArray&amp; operator=(MyImprovedArray&amp;&amp;) 吗?如果是这样,是否只需要执行基类std::move?还是它也需要执行std::swap

MyImprovedArray(MyImprovedArray&& t)
    : MyArray(t)


【问题讨论】:

有疑问,您仍然可以使用MyImprovedArray(MyImprovedArray&amp;&amp;) = default; 只要你没有虚拟基地,默认就可以。如果你有一个虚拟基地,you may need to take a look at your copy/move assignment operators。 【参考方案1】:

Rule of five(或零)适用于派生类,无论基类定义什么。

如果您派生的MyImprovedArray 的移动构造函数不会做任何特殊的事情,请不要定义它,让编译器生成一个。

【讨论】:

所以我很清楚,这意味着我不需要在MyImprovedArray 中写任何东西?也就是说,声明和: MyArray(std::move(t))(和空体)是假的? (很抱歉问。在 C++ 中,我曾多次被 “当你不需要它时不要为它付费” 的口头禅所困扰。它以虚拟析构函数结尾很糟糕)。 正确(显然除了构造函数)。如果您没有定义析构函数、移动构造函数、复制构造函数、移动赋值运算符或复制赋值运算符,那么编译器将为您生成它们(假设类基于其成员是可复制/可移动的)

以上是关于当基类提供时,派生类是不是需要实现移动语义?的主要内容,如果未能解决你的问题,请参考以下文章

析构函数 声明为protected

当基类实现 tableView:heightForRowAtIndexPath: 时如何使用 UITableViewAutomaticDimension:

virtual

当基类不包含数据成员时,是不是仍然需要虚拟继承?

不是抽象类的基类不是好基类

为啥我的性能慢到爬行我将方法移动到基类中?