非造晶和非抽象基类中的虚拟破坏者

virtual destructors in non-polymorphic and non-abstract base class

本文关键字:虚拟 破坏者 抽象 基类      更新时间:2023-10-16

如果问这个问题,我道歉。我正在写一个将与Python接触的C 类。到目前为止,类实施是:

struct body_data
{
map <int, atom*> atoms;
map <int, bond*> bonds;
map <int, dihedral*> dihedrals;
};

此类是另一个类的基类。我没有在此课程中添加灾难函数,因为我很困惑。在所有有关基础类别的破坏者的文章中,他们认为毁灭者应该是公共虚拟的或受保护的。由于我不打算在C 代码或Python界面中使用上述类多态使用,我真的需要使Destructor公开虚拟或受保护吗?我正在考虑将课程公开,以便程序员知道永远不要用多态使用此类。我的想法正确吗?

您只需要需要当您具有虚拟功能时,要将公共驱动器声明为虚拟的,这表明您打算从中衍生出您的类型。我强调"需求",因为仅当您的基本类型具有非POD类型时,您才知道您知道从您的类型中衍生的类型将具有非POD类型。是的,您可以拥有一个零虚拟成员的基类,但是这样的基础将具有边缘效用。不必要地添加虚拟成员会添加开销。即,如果您的类型除虚拟驱动器以外没有虚拟成员,则通常您已经通过一个指针增加了每个实例的大小,并且对对象的破坏会稍慢一些,因为您必须至少通过至少通过至少通过至少调用destructor单个内存间接。第一个后,逐步添加虚拟成员应该具有固定的内存成本,但是您仍然会为不必要的虚拟化功能施加运行时罚款。

就您而情况您肯定会想定义适当交易记忆的驱动器,并且由于您表示它是其他类型的基础,因此应将其标记为虚拟,除非您绝对可以确保实例永远不会从任何事物中销毁任何东西除了指向最派生的类型的指针(做出此假设非常危险,并且失败可能导致难以诊断内存泄漏)。