我需要声明敲定方法finalize()的基础类的所有后代Base,应该销毁过程中被调用,我的意图是要求纯粹virtual void Base::finalize() = 0从~Base(),但C++者禁用这样的事情.所以我的问题是
我们怎样才能迫使后代以正确和初步的方式完成一些最终的工作?
该代码无法编译:
#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;
}
Run Code Online (Sandbox Code Playgroud)
如果我Base::finalize()不是纯粹的虚拟,那么它就会从~Base()没有调度到子节点来调用,因为它已经被破坏了.
我可以从孩子的析构函数中调用finalize(),但问题是如何强制这样做.换句话说,我的问题是:是否有可能迫使编写Base类后代的人使用finalizing方法,而不是在文档中对其进行评论?:)
析构函数是发布所获资源的正确位置,但每个类都负责发布自己的资源.获得的资源class A不应该(也不能)被释放class Base.
定义虚拟析构函数允许class A在删除class Base指向class A对象的指针时调用析构函数
Base* p = new A;
delete p; // Both A and Base destructors are sequencially called!
Run Code Online (Sandbox Code Playgroud)
因此,为了实现适当的资源释放,您只需在自己的析构函数中释放每个类的资源.
| 归档时间: |
|
| 查看次数: |
3591 次 |
| 最近记录: |