У меня есть некоторые конкретные вопросы о виртуальных деструкторах и vtable.Виртуальный деструктор C++ & vtable
Предположим, у меня есть следующий код:
class Base
{
public:
virtual ~Base();
};
class Child : public Base
{
public:
~Child();
};
Вопросы:
- Где сохраненную виртуальные таблицы? Всегда ли это в базовом классе, и все подклассы просто содержат указатель на него?
- Добавление виртуального метода только увеличивает размер (класс) на 8 байтов вправо? (предположим, 64-битная система) Как насчет базового класса, если он хранит таблицу?
- Создание экземпляра типа Child через новый оператор, а затем удаление ... будет вызван деструктор базы? (Я спрашиваю, потому что деструктор класса Child не является виртуальным ... означает ли это, что это влияет только на подкласс Child?).
* 1 и 2: * осуществление определено. * 3: * Да. – DeiDei
Я предполагаю, что вы имели в виду 'Ребенок' на самом деле быть дочерним классом' Базы'? –
1. (a) Каждый класс должен иметь свою собственную таблицу vtable, иначе техника не может работать. (б) В действительности нет такой вещи, как «в классе». 2. поэтому не имеет значения. 3. Деструктор ребенка * является * виртуальным, если базовый класс. – EJP