C++抽象类需要遵守五法则吗?
Do C++ abstract classes need to obey the rule of five?
当实现这样的抽象类时:
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 类型对象中。通过删除副本和分配,您可以防止用户或您自己这样做。
相关文章:
- 无法创建抽象类的实例
- 用pybind11包装C++抽象类时出错
- 如何处理从一个对象传递到另一个在C++中具有公共抽象类的对象的消息
- 有没有办法按值将纯抽象类的所有子类传递给 C++ 中的函数?
- 抽象类错误,请参阅声明" "是抽象的
- 将自定义函数传递到基抽象类中以延迟执行
- 将包含抽象类和普通类C++包导出到 Python
- C++:处理抽象类中的错误时出现问题
- C ++如何在原始抽象类中创建一个函数,该函数接受派生类的输入
- 在 C++ 中使用另一个头文件中的抽象类
- ATL::CComContainedObject<contained>: C2259 无法实例化抽象类
- C++:从抽象类重写纯虚拟运算符重载
- 如何创建shared_ptr抽象类的容器
- .h 或.cpp文件中的抽象类或两者兼而有之?
- 从抽象类继承以创建另一个抽象类时,我应该重新声明所有虚函数吗?
- E0322:不允许使用抽象类类型 " " 的对象
- 可视抽象类 c++(错误 LNK 2001:未解析的外部符号)
- 提升 - 类没有名为"序列化"的成员(抽象类)?
- 如何将子类作为函数的参数传递给期望基类,然后将该对象传递到指向这些抽象类对象的指针向量中?
- 对纯抽象类中方法的未定义引用