【发布时间】:2020-08-25 18:48:58
【问题描述】:
我有一个纯抽象类:
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类的这个实现的析构函数?
【问题讨论】:
-
你需要在基类上声明和定义一个虚析构函数。它可能是空的,但它需要存在,以便在销毁时,可以找到并调用适当的析构函数。 stackoverflow.com/questions/270917/…
-
然后
.reset()会起作用吗? -
重置会导致对象的定期销毁。如果一个对象有一个虚拟析构函数,这将导致派生的析构函数被调用。简而言之,是的。
-
@Evg 确实如此,但如果您在基类中没有受保护/私有析构函数,我会认为这是不好的设计。此外,我不会以此为理由在
unique_ptr和shared_ptr之间进行选择,因为它们有不同的用途。 -
不应该
Concrete继承自Abstract吗?
标签: c++ interface virtual destructor unique-ptr