Re[3]: Проблема с виртуальной функцией
От: Аноним  
Дата: 18.06.02 20:10
Оценка:
Здравствуйте 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");") вызывается до деструктора класса А. И ТВФ все еще валидна в этот момент, и правильная виртуальная функция будет вызвана.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.