如果有人质疑这个问题我会道歉。我正在编写一个将与python接口的c ++类。到目前为止的类实现是:
struct body_data
{
map <int, atom*> atoms;
map <int, bond*> bonds;
map <int, dihedral*> dihedrals;
};
此类是另一个类的基类。我没有在这个类的析构函数中添加,因为我很困惑。在我读过有关基类的析构函数的所有帖子中,他们建议析构函数应该是公共虚拟的还是受保护的。由于我不打算在c ++代码或python接口中多态地使用上述类,我是否真的需要将析构函数设置为公共虚拟或受保护?我正在考虑让这个类公开,所以程序员会知道永远不会以多态方式使用这个类。我的想法是否正确?
答案 0 :(得分:2)
当你有虚函数时,你只需需要一个公共析构函数被声明为虚拟,表明你打算从中派生你的类型。我强调“需要”,因为只有当您的基类型具有非POD类型或时才需要它,您知道从您的类型派生的类型将具有非POD类型。是的,您可以拥有一个虚拟成员为零的基类,但这样的基础将具有边际效用。不必要地添加虚拟成员会增加开销。即如果你的类型没有虚拟析构函数以外的虚拟成员,通常你会用一个指针增加每个实例的大小,并且所述对象的破坏会稍微慢一点,因为你必须通过至少调用析构函数单个内存间接。在第一个虚拟成员之后逐步添加虚拟成员应该具有固定的内存成本,但是您仍然会为不必要的虚拟化功能限制运行时处罚。
在您的情况下,您的数据类型似乎表示动态分配的内存(其值为原始指针的映射)的所有权,并且您已指出这是用作其他类型的基础(这是关键),其中你绝对想要定义一个正确释放内存的析构函数,并且因为你已经声明它是其他类型的基础,它应该被标记为虚拟,除非你绝对可以确保实例永远不会被破坏。除了指向派生类型最多的指针(使这个假设非常危险,失败可能导致难以诊断内存泄漏)。