2015-02-27 3 views
4

Нужен ли виртуальный деструктор для классов, которые будут использоваться в Qt-way: установите QObject -parent, который вызовет деструктор QObject deleteLater() или что-то подобное для любого объекта, для которого он был установить как родитель?Виртуальный деструктор класса C++ Qt

Например:

class MyWidget : public QWidget { 
public: 
    MyWidget() { 
     w = new QWidget(this); 
     // "w" will be deleted automatically by parent MyWidget::QWidget::QObject's destructor afaik 
    } 
private: 
    QWidget *w; 
} 

нам нужен виртуальный деструктор для класса MyWidget делать, если он собирается быть унаследованы? Я не вижу причин для этого, потому что он ничего не удаляет, и каждое свойство класса, которое получено из QObject, будет удалено с MyWidget :: QWidget :: QObject. Деструктор.

+0

Я не понимаю вопроса: все, что происходит от 'QObject', уже имеет виртуальный деструктор. Вы можете добавить класс, но это только дополнение. Нет причин добавлять пустых деструкторов, если это то, о чем вы просите. –

ответ

2

Вам не нужно явно написать (пустой) virtual деструктора, потому что QWidget уже отмечает свой деструктор, как virtual, так автоматически все деструкторы иерархии классов являются virtual.

Но в общем, если вы пишете класс, который будет наследоваться (и еще не имеет базовый класс с virtual деструктора), всегда указывать virtual деструктор, иначе все будет взрывать плохо, если кто-то пытается для уничтожения объекта вашей иерархии классов с помощью указателя типа базового класса.

4

Не имеет значения, добавьте его или нет, поскольку QObject, унаследованный QWidget, имеет виртуальный деструктор, и это распространяется по всей иерархии.

Смежные вопросы