零规则与基类析构函数
rule of zero vs. base class destructors
我有一个基类Base
和一个派生类D
,我想让编译器为我自动生成移动构造函数和移动赋值运算符。遵循零法则,我将所有内存管理留给编译器,只使用 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;
}
应该就是这样吧?
输入C++核心准则:
基类析构函数应该是公共的和虚拟的,或者受保护的和非虚拟的。
啊,所以我想我将不得不添加一个析构函数来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_;
};
您可以创建一次类似的类
struct VirtualBase
{
virtual ~VirtualBase() = default;
VirtualBase() = default;
VirtualBase(const VirtualBase&) = default;
VirtualBase(VirtualBase&&) = default;
VirtualBase& operator = (const VirtualBase&) = default;
VirtualBase& operator = (VirtualBase&&) = default;
};
然后遵循零规则:
class Base : VirtualBase
{
public:
Base(): a_(42) {}
virtual void show() { std::cout << "Base " << a_ << std::endl; }
private:
int a_;
};
相关文章:
- 使用基类指针创建对象时,缺少派生类析构函数
- 对具有动态分配的内存和析构函数的类对象的引用
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- 即使基类和派生类只使用基元数据类型,我是否需要定义虚拟析构函数
- C++11:我可以显式调用基类析构函数来销毁派生类吗
- 为什么我不能使用已删除或私有析构函数分配类的数组?
- 显式默认析构函数禁用类中的默认移动构造函数
- 具有受保护析构函数的类数组的动态分配
- 不带名称、构造函数或析构函数的类
- 我可以从析构函数的类方法调用它吗
- 否,除非函数返回具有抛出析构函数的类
- 析构函数子类中的 c++ 分段错误
- 从没有虚拟析构函数的类继承
- 非平凡的析构函数使类具有非平凡的可构造性
- 是否应该初始化具有未重写的纯虚拟析构函数的类
- 为什么带有用户定义析构函数的类的实例将成员指针设置为零
- 为什么不能对带有析构函数的类进行忆及
- 为什么不为定义了析构函数的类合成move操作呢?
- 在析构函数中将类成员设置为空
- 在第三方软件中派生没有虚析构函数的类