我认为单独的虚拟通常就足够了。
除了强制派生类实现自己的析构函数之外,还有其他理由让它成为纯虚拟的吗?我的意思是,如果你在你的类的构造函数中分配一些东西,你应该实现你自己的析构函数——不管你的类是否派生。
不算作我已经知道的答案:如果你想要你的类抽象并且它没有纯虚函数 - 把它留给析构函数。
还有一些用途?
我认为单独的虚拟通常就足够了。
除了强制派生类实现自己的析构函数之外,还有其他理由让它成为纯虚拟的吗?我的意思是,如果你在你的类的构造函数中分配一些东西,你应该实现你自己的析构函数——不管你的类是否派生。
不算作我已经知道的答案:如果你想要你的类抽象并且它没有纯虚函数 - 把它留给析构函数。
还有一些用途?
不,如果基类分配了任何东西,则有责任释放它。
此外,如果派生类不分配任何东西,那么强迫他们编写一个虚拟 dtor 是没有意义的。
如果你想要你的类抽象并且它没有纯虚函数 - 把它留给析构函数。
实际上,我认为没有更多。纯虚析构函数所做的一切,就是使整个类抽象。您必须为纯虚拟析构函数和非纯虚拟析构函数提供实现,派生类的析构函数是虚拟的,只有虚拟析构函数,等等。
基本上,如果一个类已经有一些纯虚函数,它的行为将等同于虚拟和纯虚析构函数。
理想情况下,语言应该有一种方法来确保(隐式或不隐式地)析构函数在抽象类中是虚拟的,而不必定义它或使其成为纯函数。但事实并非如此。
所以选择是:要么让它纯粹,并有责任在每个派生类中定义它,要么不让它,并有责任在抽象类中定义它。后者的工作量更少,代码也更短,所以我会去做。
如果您的抽象类是一个纯接口,没有数据成员,那么您可以将 dtor 设为纯虚拟。我自己更喜欢这样,因为我见过很多炙手可热的程序员根本忘记创建虚拟析构函数:即使他们编写包含虚拟方法的派生类也是如此。所以我会这样做纯粹是为了尽量减少以后的维护麻烦。