c++ - 零规则与基类析构函数

标签 c++ c++11 rule-of-zero

我有一个基类 Base 和一个派生类 D,我希望编译器为我自动生成移动构造函数和移动赋值运算符。关注Rule of 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;
}

应该是这样吧?

输入 the C++ core guidelines :

A base class destructor should be either public and virtual, or protected and nonvirtual.

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

这里干净的出路是什么?

最佳答案

您可以= 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_;
};

关于c++ - 零规则与基类析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41424959/

相关文章:

c++ - 我做错了什么?牡丹&QT&SHELL解密

c++ - 自己的 C++11 随机数分布实现

c++ - 无法理解零规则中的 C++11 语法

c++ - 在字符串、u16string 和 u32string 之间转换

c++ - 指向基类的成员指针

java - 将 C++ 构造函数翻译成 Java

c++ - std::valarray 的 future 会是什么样子?

c++ - 将 unique_ptr<Derived>& 传递给接受 unique_ptr<Base>& 的函数

C++ 零规则 : polymorphic deletion and unique_ptr behavior