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)
第一个版本更短,
第二个版本更具吸引力,因为界面的所有功能都是纯虚拟的
有什么理由我应该选择一种或另一种方法(或者可能是第三种方法)?
谢谢
据我所知,虚拟函数纯虚拟的目的是强制派生类为它提供实现,或者通过显式写入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)
希望有所帮助.