Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ Qt уничтожение дочерних объектов

Автор: wdefik 3.4.2010, 14:59

сразу к проблеме:

необходимо, чтобы классы, унаследованные от QT-классов обладали некоторым общим дополнительным интерфейсом, необходимым в контексте некоторой задачи. Как правильно организовать наследование и уничтожение объектов таких классов средствами Qt ? QT при уничтожении родительского класса вызывает деструктор дочернего или может, как всегда, что-нибудь более изощренное?

т.е. например:

CODE
class Interface : public QWidget
{
public:
Interface(QWidget *parent) : QWidget(parent){}
virtual void func1()=0;
virtual void func2()=0;
virtual ~Interface(){}

};


class Derived : public Interface
{
Derived(QWidget *parent) : Interface(parent){}
virtual void func1(){}
virtual void func2(){}
~Derived(){}

};


int main(int argc, char* argv[])
{
QApplication app(argc, argv);

QMainWindow *ptr = new QMainWindow(0);

Interface *Iptr = new Derived(ptr);

return app.exec();

}


А теперь сам вопрос:

Как QT будет уничтожать такой объект? Наверное нужно читать документацию, но, к сожалению нет времени, так что ненавязчиво прошу просветить меня по этому вопросу?

Корректен ли такой код? не будет ли утечек памяти?

Новичок. Не пинать.



Автор: kwisp 3.4.2010, 15:09

wdefik,
если коротко, то:
1. если класс наследник QObject`a и у этого класса есть хозяин/владелец/parent то за уничтожение объекта этого класса отвечает parent, в деструкторе этого класса необходимо лишь освободить память из под динамически созданных членов класса ненаследников QObject`a.

2. в остальных случаях должны действовать основные принципы С++.

Автор: wdefik 3.4.2010, 18:10

Цитата(kwisp @ 3.4.2010, 15:09) *
wdefik,
если коротко, то:
1. если класс наследник QObject`a и у этого класса есть хозяин/владелец/parent то за уничтожение объекта этого класса отвечает parent, в деструкторе этого класса необходимо лишь освободить память из под динамически созданных членов класса ненаследников QObject`a.

2. в остальных случаях должны действовать основные принципы С++.


Для этого кода это означает,что сначала вызовется Деструктор QWidget'а, далее, так как деструктор класса Interface виртуальный, то вызовется деструктор класса Derived, который сначала вызовет деструктор класса Interface, а потом свой ?

Автор: wdefik 3.4.2010, 19:21

Ой, конечно же сначала свой а потом Интерфейса?

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)