提问人:3DMage 提问时间:12/13/2022 更新时间:12/13/2022 访问量:110
C++ 中的五法则、继承和多态性之间有什么关系?[复制]
What is the relationship between the Rule of Five, Inheritence, and Polymorphism in C++? [duplicate]
问:
我一直在学习析构函数、复制构造函数、移动构造函数等。我还学习了关于在基类中将析构函数标记为虚拟的建议,该基类具有从它继承的派生类。
根据五法则,如果我在类中定义析构函数,我还应该定义复制构造函数和赋值运算符,以及类中的移动构造函数和赋值运算符。
我关于五法则的问题与继承和多态性有关。如果我创建一个基类,该基类具有从它继承的派生类,那么五法则是否仅适用于基类,还是也适用于派生类?
答:
1赞
HolyBlackCat
12/13/2022
#1
基类的作用(它自定义的特殊成员)不会影响派生类的 3/5/0 规则。如果派生类不需要为自己自定义特殊成员,则应使用零规则。
请注意,仅添加虚拟析构函数确实算作出于 3/5/0 规则的目的对其进行自定义,这意味着您必须遵循该类的 3/5 规则。
但原因并不明显:声明任何析构函数(无论是否)都会剥夺您的移动操作,只留下复制操作。这会静默地将您班级的所有动作替换为副本,这并不好。(这不会影响派生类,这些类仍会移动,但其中的基类子对象除外。=default
=default
ing 移动操作以将它们带回,然后删除复制操作,这些操作也需要 ed。=default
上述内容仅对具有数据成员的类(从移动中受益)有影响,但还有另一个问题:在声明析构函数时,复制操作仍然存在,因此它们应该像移动操作一样消失。
这意味着,如果您有虚拟析构函数,即使您没有数据成员,也必须执行复制和移动操作,以避免弃用警告(生成时使用以启用它们)。=default
-Wdeprecated
评论
= delete