如何调用抽象类的子代的析构函数?

问题描述 投票:0回答:1

我有一个纯粹的抽象类:

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类实现的析构函数?

c++ interface virtual destructor unique-ptr
1个回答
1
投票

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

如此简单的解决方法是将destructor设为Abstract Classvirtual

所以Abstract Class的声明将如下所示:

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

由于在main.cpp中出现的原因而出现,因为您正在使用Concrete Class指向pointer of the Abstract Class的对象,并且在Abstract类的指针上执行了reset()后,它将使destructor of only Abstract class被激活。

但是一旦您创建了destructor of the Abstract Class as Virtual,它将首先调用**具体类的析构函数**首先****,然后将调用destructor of the Abstract Class

有关更多详细信息,我共享一个线程供参考When Should we Use Virtual keyword ?

© www.soinside.com 2019 - 2024. All rights reserved.