如何处理界面中的析构函数

Arm*_*yan 7 c++ oop destructor interface

当我用C++编写接口类时,我选择以下两个选项之一

class Interface
{
public:
   virtual R1 f1(p11, p12 , ...) = 0;
   ...
   virtual Rn fn(pn1, pn2 , ...) = 0;
   virtual ~Interface() {} 
}
Run Code Online (Sandbox Code Playgroud)

要么

class Interface
{
public:
   virtual R1 f1(p11, p12 , ...) = 0;
   ...
   virtual Rn fn(pn1, pn2 , ...) = 0;
   virtual ~Interface() = 0; 
}
Interface::~Interface() {}
Run Code Online (Sandbox Code Playgroud)

第一个版本更短,
第二个版本更具吸引力,因为界面的所有功能都是纯虚拟的

有什么理由我应该选择一种或另一种方法(或者可能是第三种方法)?
谢谢

Naw*_*waz 5

据我所知,虚拟函数纯虚拟的目的是强制派生类为它提供实现,或者通过显式写入Base::f()来选择默认实现Derived::f().

那么如果这是真的,那么制作虚拟析构函数的目的是pure virtual什么?它是否强制派生类为其提供实现Base::~Base()?派生类可以实现Base::~Base()吗?没有.

这意味着,带有virtual析构函数的第一个版本似乎足以满足几乎所有目的.毕竟,虚拟析构函数最常见的目的是客户端可以delete通过类型指针正确地对象派生类Base*.

但是,如果你只在Base 虚拟中创建所有函数,而不是 虚函数,并为它们提供实现(实际上你要提供),同时你想要创建Base 抽象类型,那么拥有一个虚拟析构函数Base就是唯一解决方案

class Base
{
public:
   virtual void f() {}; //not pure virtual
   virtual ~Base() = 0; //pure - makes Base abstract type!
};

Base::~Base() {} //yes, you have to do this as well.

Base *pBase = new Base(); // error - cannot create instance!
Run Code Online (Sandbox Code Playgroud)

希望有所帮助.