Почему деструктор виртуального класса не добавляется в виртуальную таблицу автоматически?

Когда виртуальный класс B является производным от виртуального базового класса A, если явно не объявлен виртуальный деструктор в A и B, деструктор B в виртуальной таблице будет указывать на деструктор A. Почему? Почему деструктор vtable B автоматически не указывает на деструктор B без необходимости определять виртуальные деструкторы A и B?

edit: понял, что, не делая деструктор A виртуальным, деструктор B даже не находится в vtable, поэтому при вызове деструктора A он просто вызывает прямые вызовы A. Мой вопрос не имеет смысла.


person geranimo    schedule 14.04.2018    source источник
comment
Потому что это то, о чем говорит языковой стандарт. А C++ работает по принципу: вы не платите за то, чем не пользуетесь.   -  person Jesper Juhl    schedule 14.04.2018


Ответы (1)


C++ работает по принципу «вы не платите за то, чем не пользуетесь». Принуждение деструктора любого класса, имеющего какую-либо виртуальную функцию, к виртуальному, даже если клиенты класса никогда не удаляют объекты этого класса полиморфно (т. е. через базовый указатель), является ненулевой стоимостью (слот в vtable, удаляет на объекте, нуждающемся в вызове виртуальной функции). Поэтому C++ не делает этого без явных инструкций.

person Sebastian Redl    schedule 14.04.2018