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

Tim*_*hko 7 c++ inheritance

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

Ant*_*rez 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! 
Run Code Online (Sandbox Code Playgroud)

因此,为了实现适当的资源释放,您只需在自己的析构函数中释放每个类的资源.

  • 这是可能的,但您可能会遇到编译器或运行时错误,因为在调用“Base”的析构函数时,“A”的析构函数已经被调用,因此没有“A”对象可以调用您的析构函数。所谓的“finalize()”方法。 (2认同)