Страницы

Поиск по вопросам

воскресенье, 2 февраля 2020 г.

В чем различие, в плане устройства, между виртуальным и не виртуальным деструкторами? [дубликат]

#cpp


        
             
                
                    
                        
                            На этот вопрос уже даны ответы здесь:
                            
                        
                    
                
                        
                            Виртуальный деструктор
                                
                                    (2 ответа)
                                
                        
                                Закрыт 3 года назад.
            
                    
Как работает виртуальный деструктор при наследовании мне известно. Мне интересен
механизм работы.

Указатель на виртуальный деструктор также хранится в vtable? Если да, то порядок
такой же как и у остальных виртуальных методов класса в таблице внутри vtable? или
оно устроено как-то по-другому, есть отличие от виртуальных методов в способе хранения?

И как обстоит дело с обычным деструктором, он хранится как обычный метод?
    


Ответы

Ответ 1



Разница в том, что если у вас планируется хоть какое-то наследование, то скорее всего будет создан объект потомка, на который будет указывать указатель на базовый класс. Base * b = new Derived; ... delete b; И вот тут, если деструктор не виртуальный, будет вызван деструктор ~Base(), что очень плохо... А если виртуальный - будет вызван деструктор ~Derived(), что и требуется... Так что главное правило - планируете наследование - делайте деструктор виртуальным!

Ответ 2



Деструктор в интересуемой Вами части ничем не будет отличаться от обычной функции-члена. Если Вы используете объект производного класса через указатель на базовый класс в процессе его удаления через delete, то деструктор базового класса должен быть виртуальным. Вот и всё.

Комментариев нет:

Отправить комментарий