我有一个纯粹的抽象类:
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
类实现的析构函数?
根据您的实现,您尚未将Abstract Class
析构函数定义为虚拟。
如此简单的解决方法是将
destructor
设为Abstract Class
为virtual
。
所以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 ?