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

时间:2018-05-26 16:30:37

标签: c++ rule-of-three

实现这样的抽象类时:

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

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

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

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

2 个答案:

答案 0 :(得分:2)

“抽象”在这里无关紧要。如果类具有默认版本无法正确复制的数据,则类需要自己的复制构造函数,复制赋值运算符等。完全停止。纯虚函数的存在与否不会改变这一点。您的示例没有任何数据,因此这里没有问题。

答案 1 :(得分:-1)

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

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类型的对象。通过删除副本和分配,您可以阻止用户或您自己这样做。