#cpp
На этот вопрос уже даны ответы здесь: Виртуальный деструктор (2 ответа) Закрыт 3 года назад. Как работает виртуальный деструктор при наследовании мне известно. Мне интересен механизм работы. Указатель на виртуальный деструктор также хранится в vtable? Если да, то порядок такой же как и у остальных виртуальных методов класса в таблице внутри vtable? или оно устроено как-то по-другому, есть отличие от виртуальных методов в способе хранения? И как обстоит дело с обычным деструктором, он хранится как обычный метод?
Ответы
Ответ 1
Разница в том, что если у вас планируется хоть какое-то наследование, то скорее всего будет создан объект потомка, на который будет указывать указатель на базовый класс. Base * b = new Derived; ... delete b; И вот тут, если деструктор не виртуальный, будет вызван деструктор ~Base(), что очень плохо... А если виртуальный - будет вызван деструктор ~Derived(), что и требуется... Так что главное правило - планируете наследование - делайте деструктор виртуальным!Ответ 2
Деструктор в интересуемой Вами части ничем не будет отличаться от обычной функции-члена. Если Вы используете объект производного класса через указатель на базовый класс в процессе его удаления через delete, то деструктор базового класса должен быть виртуальным. Вот и всё.
Комментариев нет:
Отправить комментарий