C++抽象类需要遵守五法则吗?

Do C++ abstract classes need to obey the rule of five?

本文关键字:抽象类 C++      更新时间:2023-10-16

当实现这样的抽象类时:

class Base
{
public:
virtual ~Base() = default;
virtual void foo() = 0;
};

此接口是否必须遵守五个规则,即我是否必须添加复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符?

我认为由于纯虚拟成员函数,无法实例化Base类型的 instace,因此为其他特殊成员函数提供默认实现可能没有真正的目的。

是否有任何用例/示例需要我提供其他特殊成员函数?

"abstract"在这里无关紧要。一个类需要自己的复制构造函数、复制赋值运算符等,如果它有默认版本无法正确复制的数据。句点。纯虚函数的存在与否不会改变这一点。您的示例没有任何数据,因此此处没有问题。

实际上恰恰相反。我会考虑删除一个应该只是一个接口类的类的复制和赋值,以避免切片。考虑

class Base {
public:
virtual ~Base() {}
};
class D1 : public Base {
int i;
public:
~D1() override {}
};
class D2 : public Base {
int i;
double d;
public:
~D2() override {}
};

你可以写这样的东西

vector<Base> vec;
D1 d;
D2 e;
vec.push_back(d);
vec.push_back(e);

.您将尝试将大小为 D2 的对象压缩到较小的 base 类型对象中。通过删除副本和分配,您可以防止用户或您自己这样做。