crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Qt уничтожение дочерних объектов, при наследовании от интерфейсных классов
wdefik
  опции профиля:
сообщение 3.4.2010, 14:59
Сообщение #1


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 4.3.2010
Пользователь №: 1505

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

необходимо, чтобы классы, унаследованные от 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
Сообщение #2


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


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

2. в остальных случаях должны действовать основные принципы С++.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wdefik
  опции профиля:
сообщение 3.4.2010, 18:10
Сообщение #3


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 4.3.2010
Пользователь №: 1505

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(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
Сообщение #4


Студент
*

Группа: Новичок
Сообщений: 14
Регистрация: 4.3.2010
Пользователь №: 1505

Спасибо сказали: 0 раз(а)




Репутация:   0  


Ой, конечно же сначала свой а потом Интерфейса?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 6.7.2020, 19:41