如何处理接口中的析构函数 当我在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!