Вызов виртуального метода из деструктора - обходной путь?

Мне нужно объявить метод завершения 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;
    }

Если я сделаю Base :: finalize () не чисто виртуальный, он вызывается из ~ Base () без отправки дочернему элементу, поскольку он уже был уничтожен.

Я могу вызвать finalize () из дочернего деструктора, но вопрос в том, как заставить это сделать. Другими словами, мой вопрос: можно ли обязать людей, которые будут писать потомков базового класса, использовать метод финализации, ну, иначе, чем комментируя его в документации? :)

7
задан Tim Kachko 2 February 2012 в 18:12
поделиться