Название: Удаление объекта Отправлено: 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 при объявлении этих функций можно не писать. |