gpt4 book ai didi

c++ - 如何处理接口(interface)中的析构函数

转载 作者:可可西里 更新时间:2023-11-01 18:28:47 26 4
gpt4 key购买 nike

当我用C++编写接口(interface)类时,我选择了以下2个选项之一

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

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

第一个版本写起来比较短
第二个吸引人的地方在于界面的所有功能都是纯虚拟的

有什么理由让我更喜欢其中一种方法(或者可能是第三种方法)?
谢谢

最佳答案

据我了解,使虚函数纯虚的目的是强制派生类为其提供实现或通过显式写入 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!

希望对您有所帮助。

关于c++ - 如何处理接口(interface)中的析构函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5361646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com