Описание.
При использовании наследования, шаблонов и виртуальных методов компилятор может сгенерировать неправильные таблицы виртуальных функций!

Воспроизвести на маленьком проекте, к сожалению, до сих пор не удалось. На больших проектах это вылазило уже около 5 раз. За последний месяц — два раза. Причем один и тот же код в разных проектах может скомпилироваться правильно, а может — нет.

Диагноз
Судя по всему — компилятор, при генерации методов шаблона или потомка от шаблона, иногда не видит, что метод определен как виртуальный в базовом классе. И может в производном классе оставить реализацию базового класса. Одним из глухих случаев был вариант, когда эта базовая реализация была определена как чистая виртуальная функция. А может орать, что отсутствует реализация абстрактного метода, хотя в производном классе этот метод реализован.

Еще один случай, от которого я еще не отошел — указатель элемента VT, может указывать на совершенно другую функцию!

Лечение
В каждом производном классе нужно явно указывать virtual для всех переопределяемых методов.

Так что, поклонникам этого чудовища нужно держать себя обеими руками за ... короче не расслабляться

PS. Пишу сюда, а не в средства разработки, что бы прочитало как можно больше заинтересованного народа.
Автор: Коваленко Дмитрий    Оценить