Автор: 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
Ой, конечно же сначала свой а потом Интерфейса?