零与基类析构函数的规则

Nic*_*mer 3 c++ c++11 rule-of-zero

我有一个基类Base和一个派生类D,我想为我自动生成移动构造函数和移动赋值运算符.遵循Zero规则,我将所有内存管理留给编译器,只使用level-2类(没有原始指针,数组等):

#include <iostream>

class Base{
  public:
    Base(): a_(42) {}
    virtual void show() { std::cout << "Base " << a_ << std::endl; }

  private:
    int a_;
};

class D : Base {
  public:
    D(): b_(666) {}
    void show() { std::cout << "D " << b_ << std::endl; }

  private:
    int b_;
};

int main() {
  Base b;
  b.show();
  D d;
  d.show();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这应该是吧,对吗?

输入C++核心指南:

基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.

啊,所以我想我必须添加一个析构函数Base.但这将取消自动生成的移动功能!

什么是干净的出路?

AMA*_*AMA 7

您可以= default使用编译器生成的所有内容.见(见下):http://en.cppreference.com/w/cpp/language/rule_of_three

在你的情况下,它可能看起来像:

class Base{
  public:
    Base(): a_(42) {}
    Base(const Base&) = default;
    Base(Base&&) = default;
    Base& operator=(const Base&) = default;
    Base& operator=(Base&&) = default;
    virtual ~Base() = default;

    virtual void show() { std::cout << "Base " << a_ << std::endl; }

  private:
    int a_;
};
Run Code Online (Sandbox Code Playgroud)