Здравствуйте PaNov, Вы писали:
PN>Кстати, недавно наступал на аналогичные грабли с точностью до наоборот... PN>Я в деструкторе базового класса вызывал виртуальную функцию, в надежде что она вызовет функцию, переопределенную в дочернем классе. PN>К тому времени отрабатывали деструкторы всех дочерних классов и по-всей видимости функции удалялись из таблицы виртуальных функций.
Ошибка у вас в рассуждениях, однако.
'деструкторы' дочерних классов вызываются после отработки вашего кода. Поэтому причина не в этом, простейший пример поможет вам получить доказательства этого. К тому же как вы себе представляете 'удаление функций из таблицы виртуальных функций'(ТВФ) ? Как это сделать физически? :)
Пример:
class A
{
public:
~A() { TRACE("A::~A()\n"); }
};
class B : public A
{
public:
~B() { TRACE("B::~B()\n"); }
};
Что по-вашему, будет в Output окошке? Правилно, вот это:
B::~B()
A::~A()
Т.е. ваш собственный код (который вместо "TRACE("B::~B()\n");") вызывается до деструктора класса А. И ТВФ все еще валидна в этот момент, и правильная виртуальная функция будет вызвана.