虚拟析构函数必须公开吗?

pre*_*uin 16 c++ destructor

我发现几乎每个虚拟析构函数的代码片段都将它作为公共成员函数,如下所示:

class Base
{
public:
    virtual ~Base()
    {
        cout << "~Base()" << endl;
    }
};
class Derived : public Base
{
public:
    ~Derived()
    {
        cout << "~Derived()" << endl;
    }
};
Run Code Online (Sandbox Code Playgroud)

虚拟析构函数必须是公共的还是存在非公共虚拟析构函数有意义的情况?

Alo*_*ave 19

虚拟析构函数必须是公共的还是存在非公共虚拟析构函数有意义的情况?

马匹课程.public如果需要多态删除,则使用虚拟析构函数,否则您的析构函数根本不需要是虚拟的.

遵循赫伯的建议:

准则#4:基类析构函数应该是公共的和虚拟的,或者是受保护的和非虚拟的.

简而言之,那么你将离开两种情况中的一种.或者:

  1. 您希望通过基指针允许多态删除,在这种情况下,析构函数必须是虚拟和公共的; 要么
  2. 你没有,在这种情况下,析构函数应该是非虚拟的并受到保护,后者可以防止不必要的使用.

  • 但是这个建议假定你永远不想通过基指针允许多态删除,*仅限于派生类*.鉴于问题是关于虚拟析构函数始终公开的动机,我认为Sutter的理由存在差距.例如,解释可以是"派生类可以将基指针强制转换为正确的派生类型然后将其删除",但这本身就做了一些假设. (3认同)
  • 或者您希望通过基指针进行多态删除的情况如何,但仅限于基类本身?然后析构函数需要是虚拟的,但它不需要是公共的.例如,基类可能为整个层次结构提供引用计数(或其他内存管理). (3认同)
  • 我想象一个类层次结构,其中总是在叶类中调用“delete”,但是叶类想要删除的内容不一定是*相同*叶类的实例,它可能是不同的实例。因此,基类需要一个虚拟析构函数,并且它可以被保护而不是公共,因为只有基类的派生类使用它。奇怪的设计,从萨特的视角来看可能不值得一提,因为任何提出这样设计的人都可以自己弄清楚后果。但我不认为可以因为不可能而拒绝它。 (2认同)

Jon*_*Jon 6

正如非虚析构函数,没有他们需要不是public,但他们大多的时间.

如果您的类是规则的一个例外,并且需要以任何理由控制其实例的生命周期,那么析构函数必须是非的public.这将影响客户如何(或不能)利用该类的实例,但这当然是重点.而且由于析构函数是virtual唯一的另一种选择virtual protected.

相关:是否有用于使受保护的析构函数虚拟化?