C++ 做C++;抽象类需要遵守五个规则吗?

C++ 做C++;抽象类需要遵守五个规则吗?,c++,rule-of-three,C++,Rule Of Three,实现这样的抽象类时: class Base { public: virtual ~Base() = default; virtual void foo() = 0; }; 此接口是否必须遵守五项规则,即是否必须添加复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符 我认为Base类型的instace由于纯虚拟成员函数而无法实例化,因此为其他特殊成员函数提供默认实现可能没有实际用途 是否有任何用例/示例需要我提供其他特殊成员函数?实际上恰恰相反。我会考虑删除一个只被定义为

实现这样的抽象类时:

class Base
{
public:
    virtual ~Base() = default;
    virtual void foo() = 0;
};
此接口是否必须遵守五项规则,即是否必须添加复制构造函数、复制赋值运算符、移动构造函数和移动赋值运算符

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


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

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

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);
vec;
D1 d;
D2 e;
向量推回(d);
向量推回(e);

。您可以尝试将大小为D2的对象压缩为类型为base的更小对象。通过删除副本和分配,您确实会阻止用户或您自己这样做。

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

您将如何实现这些构造函数/运算符?:PYou
default
ed您的析构函数,意味着您告诉编译器生成一个析构函数。它应该和你什么都不做没有什么不同。@KillzoneKid,但我想它的目的是让析构函数是虚拟的。@juanchopanza是的,我的意思是它不应该影响你如何使用三的规则,在这种情况下,应该遵守零规则。
>您可以编写类似这样的东西
您的基类不是抽象类,但OP的是抽象类<代码>d1d;D2 e不可能我道歉。这是非常正确的,但这并不会使所提到的问题无效。不过,让拷贝分配受到保护是有意义的。这样,任何试图执行此任务的人都将被阻止。@重复数据消除程序-根据类的设计角色,有许多事情可能重要,也可能不重要。抽象不是一种角色;它是一种工具,它的使用并不意味着对复制的限制。