我需要为基类finalize()
的所有后代声明最终化方法Base
,这应该在销毁期间调用,我的意图是从{{{名}调用纯virtual void Base::finalize() = 0
1}},但是c ++禁止这样的事情。所以我的问题是
我们怎样才能让后代以正确和初步的方式完成一些最终的工作?
无法编译该代码:
~Base()
如果我使#include <QDebug>
class Base {
public:
Base(){}
virtual ~Base(){
qDebug("deleting b");
finalize();
}
virtual void finalize() = 0;
};
class A : public Base
{
public:
A(){}
~A(){}
void finalize(){qDebug("called finalize in a");}
};
int main(int argc, char *argv[])
{
Base *b = new A;
delete b;
}
不是纯虚拟的,则会从Base::finalize()
调用它,而不会调度到子节点,因为它已经被破坏了。
我可以从孩子的析构函数中调用finalize(),但问题是如何强制这样做。换句话说,我的问题是:是否有可能迫使编写Base类后代的人使用finalizing方法,而不是在文档中对其进行评论? :)
答案 0 :(得分:7)
析构函数是发布获取资源的正确位置,但每个类都负责发布自己的资源。 class A
获取的资源不应(也不能)由class Base
发布。
定义虚拟析构函数允许在删除指向class A
对象的class Base
的指针时调用class A
的析构函数
Base* p = new A;
delete p; // Both A and Base destructors are sequencially called!
因此,要实现正确的资源释放,您只需在其自己的析构函数中释放每个类的资源。
答案 1 :(得分:3)
这就是虚拟析构函数的用途:
class A
{
public:
virtual ~A() {}
};
class B : public A
{
public:
virtual ~B() {}
};
当类型B
的对象被销毁时,无论是指向B
的指针还是指向A
的指针,都将调用两个析构函数。首先是B::~B()
,然后是A::~A()
。
答案 2 :(得分:1)
使用正文使基类析构函数为纯虚拟,这应该完全符合您的要求。
答案 3 :(得分:0)
为什么不使用Base的析构函数?什么是析构函数是为了。
进行搜索RAII并发现c ++中最好的东西之一。
过去使用其他语言的大多数人都必须发现这一点。 c ++中的资源管理与大多数其他计算机语言完全不同