从析构函数调用虚方法 - 解决方法?

时间:2012-02-02 15:28:40

标签: c++ inheritance

我需要为基类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方法,而不是在文档中对其进行评论? :)

4 个答案:

答案 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 ++中的资源管理与大多数其他计算机语言完全不同