Russian Qt Forum

Программирование => С/C++ => Тема начата: qt_user от Ноябрь 18, 2011, 15:41



Название: Удаление объекта
Отправлено: qt_user от Ноябрь 18, 2011, 15:41
Добрый день,
возник чисто спортивный интерес по поводу удаления QState объектом QStateMachine

void QStateMachine::addState ( QAbstractState * state ) принимает указатель типа QAbstractState
если посмотреть в ассистанте описание деструктора QAbstractState::~QAbstractState () - то он совсем
не виртуальный, если же удалить объект QStateMachine, все QState удаляются правильно

Вопрос: это просто ошибка в ассистанте или эти "state" кастятся перед удалением к QState ?


Название: Re: Удаление объекта
Отправлено: BRE от Ноябрь 18, 2011, 15:54
Так QAbstractState наследник QObject. А у этого деструктор виртуальный. :)


Название: Re: Удаление объекта
Отправлено: qt_user от Ноябрь 18, 2011, 16:14
Так QAbstractState наследник QObject. А у этого деструктор виртуальный. :)

Спасибо,
наверно это мои пробелы в понимании С+, буду рад если вы объясните мне не которые вещи:

1. знаю, что если класс родитель имеет таблицу виртуальных методов, то класс наследник тоже будет
иметь таблицу виртуальных методов и свой vpointer установленный на нее, верно это?

2. так получается что деструктор живет в таблице виртуальных ф-ций если она есть?

3. Я представляю алгоритм поиска деструктора компилятором такой:
если есть vpointer, то деструктор берем с vtable, если нет вызываем по типу указателя, это верно?


Название: Re: Удаление объекта
Отправлено: andrew.k от Ноябрь 18, 2011, 16:20
Деструктор не обязательно виртуальный, если есть виртуальные методы.
Он виртуальный, если его объявить виртуальным. От других вводных не зависит.


Название: Re: Удаление объекта
Отправлено: Alex Custov от Ноябрь 22, 2011, 03:28
Спасибо,
наверно это мои пробелы в понимании С+, буду рад если вы объясните мне не которые вещи:

Любая функция (метод), в т.ч. и деструктор, становится виртуальной с того момента,  как её объявили таковой. В классах-наследниках ключевое слово virtual при объявлении этих функций можно не писать.