C++抽象类析构函数

use*_*182 5 c++ abstract-class destructor

在父类中仅使用纯虚拟析构函数创建抽象类是否是良好的实践(并且可能)?

这是一个样本

class AbstractBase {
public:
    AbstractBase () {}
    virtual ~AbstractBase () = 0;
};

class Derived : public AbstractBase {
public:
    Derived() {}
    virtual ~Derived() {}
};
Run Code Online (Sandbox Code Playgroud)

否则,如果衍生类的属性和构造函数都相同而另一个方法完全不同,我怎么能创建一个抽象类?

arm*_*ali 13

C++中的接口应该有一个实现的虚拟析构函数,什么都不做.接口中的所有其他方法都被定义为抽象(例如,在声明中添加= 0).这将确保您无法创建接口类的实例,但是一旦将接口指针指定给父对象,就可以删除对象.抱歉措辞不好,下面是一些代码:

class ISampleInterface
{
public:
    virtual ~ISampleInterface() { };
    virtual void Method1() = 0;
    virtual void Method2() = 0;
}

class SampleClass : public ISampleInterface
{
public:
    SampleClass() { };
    void Method1() { };
    void Method2() { };
}

int main()
{
    ISampleInterface *pObject = (ISampleInterface*)new SampleClass();
    delete pObject;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


Ole*_*leg 5

在基类中只有一个纯虚拟析构函数很少是一种好的做法,但它是可能的,在某些情况下甚至是可取的.
例如,如果依靠RTTI通过在指向基类的指针上尝试dynamic_cast来将消息分派给子类对象,则除了析构函数之外,基类中可能不需要任何方法.在这种情况下,将析构函数设为公共虚拟.

由于除了析构函数之外没有其他虚方法,因此必须将其设置为纯,以防止创建基类的对象.
在这里,为这个析构函数提供空体是至关重要的(即使它是"= 0"!)

struct AbstractBase {
     virtual ~AbstractBase() = 0;
}

AbstractBase::~AbstractBase() {
}
Run Code Online (Sandbox Code Playgroud)

让body允许创建子类对象(假设子类定义析构函数并且不将其设置为纯粹).