关于c ++:委托应该有一个虚拟析构函数吗?

Should delegate have a virtual destructor?

delegate模式中,使destuctor虚拟化好吗?

1
2
3
4
5
6
7
8
9
class MyClass
{
    ...
};

class MyClassDelegate
{
    ...
};

一方面,类MyClassDelegate是一个接口,应该是从中继承的,另一方面,它不应该通过MyClassDelegate指针delete继承subclass

你怎么认为?


您可以考虑将其设置为受保护的非虚拟-然后您实际上正在强制执行并记录不能使用此类指针删除对象的事实。这里可以找到更多的讨论


如果计划让类从MyClassDelegate继承,最好给它一个虚拟析构函数。

在您的初始设计中,您可能不会计划使用delete任何指向MyClassDelegate的指针,但这种设计将不断发展,您的选择将对这种发展方式施加限制。这个特定的约束很容易被忘记,并且导致的崩溃(或细微的错误)可能需要一段时间来诊断。


如果您已经拥有其他虚拟函数,则使析构函数成为虚拟的,几乎不会带来开销。