С++: каковы причины ссылки undefined на "typeinfo для [имя класса]", кроме виртуальных функций

некоторые из этих ошибок решаются путем изменения

    virtual void draw();

к

    virtual void draw() {};

НО, каковы могут быть другие причины этих ошибок?, кроме виртуальных функций. Что может быть причиной следующей ошибки.

  /tmp/cciGEgp5.o:(.rodata._ZTI14CustomXmppPump[typeinfo for CustomXmppPump]+0x18): 
  undefined reference to `typeinfo for XmppPump'

Ответ 1

Если вы компилируете RTTI (-frtti), убедитесь, что ваши зависимые библиотеки также скомпилированы вместе с ним, а не -fno-rtti. В противном случае вы получите ошибку typeinfo при подклассе класса, скомпилированного с -fno-rtti или используя dynamic_cast.

Ответ 2

В GCC первый неединичный виртуальный метод используется для определения единицы перевода, в которой создаются объекты vtable и typeinfo. Если вы затем не определяете этот метод, он создает ошибку, которую вы видите, поскольку он ожидал, что вы определите этот метод где-нибудь, и ожидал, что это определение испустит вывод vtable и typeinfo для класса.

http://gcc.gnu.org/onlinedocs/gcc/Vague-Linkage.html

Когда вы меняете объявление virtual void draw(); на встроенное определение virtual void draw() {};, он выбирает другую функцию для испускания vtable.