如何调用抽象 class 的 child 的析构函数?

How to call the destructor of a child of an abstract class?

我有一个纯抽象的class:

class Abstract{
     void func1(arg1, arg2) = 0;
}

及其使用析构函数的实现:

class Concrete : public Abstract{
void func1(arg1,arg2) { /*implementation code..*/ };
~Concrete() {/*code for the destructor..*/}

在main.cpp中我为它创建了一个唯一的指针:

 int main(){
 std::unique_ptr<Abstract> class = std::make_unique<Concrete>();
 //do operations with it
 class.reset();
 }

完成 class 后,我需要它调用其当前 implementation class 的(自定义)析构函数,但 .reset() 不会那样做。如何调用 Abstract class 的这个实现的析构函数?

根据您的实施,您尚未将 Abstract Class 析构函数定义为虚拟。

So simple fix will be to make the destructor of the Abstract Class as virtual.

因此 摘要 Class 的声明如下所示:

class Abstract{
     public:
     void func1(arg1, arg2) = 0;
     virtual ~Abstract() {/*..Destrctor Body..*/}
}

现在是因为在 main.cpp 中,您使用 pointer of the Abstract Class 指向 Concrete Class 的对象,并且当您在抽象 class 的指针上执行了 reset() ,它将导致 destructor of only Abstract class 被调用。

但是一旦你创建了 destructor of the Abstract Class as Virtual ,它就会调用 Concrete Class 的**析构函数 **首先**** 然后是 destructor of the Abstract Class 将被调用。

更多细节我分享一个帖子供参考When Should we Use Virtual keyword ?