如何处理接口中的析构函数 当我在C++中编写接口类时,我选择以下2个选项之一: class Interface { public: virtual R1 f1(p11, p12 , ...) = 0; ... virtual Rn fn(pn1, pn2 , ...) = 0; virtual ~Interface() {} }

如何处理接口中的析构函数 当我在C++中编写接口类时,我选择以下2个选项之一: class Interface { public: virtual R1 f1(p11, p12 , ...) = 0; ... virtual Rn fn(pn1, pn2 , ...) = 0; virtual ~Interface() {} },c++,oop,interface,destructor,C++,Oop,Interface,Destructor,或 第一个版本写起来更短 第二个很吸引人,因为接口的所有功能都是纯虚拟的 有什么理由我应该选择一种或另一种方法(或者第三种) 在第一种情况下,派生类可以选择是否实现析构函数。 在第二种情况下,必须重写纯虚拟析构函数,因此派生类被迫实现析构函数 除非您有什么原因想强制执行此操作,否则我将使用第一种情况。据我所知,使虚拟函数纯虚拟的目的是强制派生类为其提供实现,或者通过在派生::f()中显式编写Base::f()来选择默认实现 如果这是真的,那么让虚拟析构函数纯虚拟的目的是什么呢?它是否强制派生类为

第一个版本写起来更短
第二个很吸引人,因为接口的所有功能都是纯虚拟的

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

在第一种情况下,派生类可以选择是否实现析构函数。 在第二种情况下,必须重写纯虚拟析构函数,因此派生类被迫实现析构函数


除非您有什么原因想强制执行此操作,否则我将使用第一种情况。

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

如果这是真的,那么让虚拟析构函数纯虚拟的目的是什么呢?它是否强制派生类为
Base::~Base()
提供实现?派生类能否实现
Base::~Base()
?没有

这意味着,第一个版本的
virtual
析构函数似乎足以满足几乎所有的目的。毕竟,虚拟析构函数最常见的用途是,客户端可以通过
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!

希望有帮助。

对我来说,dtor不是界面的一部分。fi()将具有其他语言的类似物,而不是dtor。同样,您可以为fi()编写前置和后置条件,但不能为dtor编写前置和后置条件。这使得它只是一个C++疣,第一种技巧是处理它的最舒服的方法。

< p>好,找到一个链接,然后我想我会把它作为一个答案来回答:

我见过一些编译器不发出 没有非内联函数时的任意v表 根本不存在(并定义在一个 实现文件而不是 标题(然后)。他们会犯错误 比如缺少A级vtable或 类似的东西,你会 像我一样困惑

事实上,这并不符合 标准,但它是这样考虑的 放置至少一个虚拟函数 不在标头中(如果只有虚拟 析构函数),使编译器 无法为位于的类发出vtable 那个地方。我知道这件事发生在你身上 gcc的一些版本。 ()


它与您的第二个案例略有不同(建议实际上将函数从头文件中完全删除,以免成为gcc问题的受害者),但我想我会提到它。gcc的怪癖有时会起作用。

错了。第二种情况不强制重写析构函数:。而且,这句话“因此基类被迫实现析构函数”对我来说没有意义。你能换个说法吗?@Nawaz-对不起,错别字了。我的意思是“衍生”,而不是“基础”。现在已经修好了。必须停止在5:AM.WART中编写代码,C++将接口的析构函数部分化。它是否是虚拟的决定了客户端是否可以通过指向base的指针有效地删除派生类的实例。有效的客户端操作==接口。但是,它是否纯粹不是外部接口的一部分,除了纳瓦兹说如果它是唯一纯函数,从而使类抽象。我同意,但是问题是关于虚拟与纯虚拟,而不是虚拟与非虚拟。好吧,我误解了你的意思,一般来说,在C++中,Dor不是接口的一部分。我同意这个问题,提供的选项之间的差异不是界面的一部分。
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!