Неопределенные символы, “vtable для …” и “typeinfo для …”?

Единственный канал, |, является одним из поразрядный операторы.

Из Википедии:

В семье языка программирования C, оператор битового "ИЛИ" "|" (канал). Снова, этот оператор не должен быть перепутан со своим булевым "логическим или" дубликатом, который рассматривает его операнды как булевы значения и записан "||" (два канала).

46
задан Martin J. 27 March 2014 в 15:22
поделиться

4 ответа

Если Препятствие является абстрактным базовым классом, убедитесь, что вы объявили все его виртуальные методы «чисто виртуальными». ":

virtual void Method() = 0;

= 0 сообщает компилятору, что этот метод должен быть переопределен производным классом и может не иметь своей собственной реализации.

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

85
ответ дан 26 November 2019 в 20:21
поделиться

The class Obstacle needs a virtual destructor. Change the destructor definition to be:

virtual ~Obstacle();

The definition of a destructor also creates the vtable for a class with virtual functions. It also ensures that a delete of a derived class instance through a base class pointer does the right thing.

(copy of my answer to question What should I do with this strange error? which seems to be a duplicate.)

6
ответ дан 26 November 2019 в 20:21
поделиться

У вас есть файл Obstacle.cc ? Если это так, вам необходимо убедиться, что он встроен в Obstacle.o , и что Obstacle.o добавляется в командную строку, когда вы связываете свою программу.

Также, убедитесь, что вы определили все не чисто виртуальные методы, которые вы объявляете. Если вы объявляете чистый виртуальный деструктор, вам также необходимо определить его.

3
ответ дан 26 November 2019 в 20:21
поделиться

vtable и typeinfo - это внутренние структуры, сгенерированные компилятором C ++. vtable используется для вызова виртуальных функций, а typeinfo используется для RTTI.

Разные компиляторы имеют разные стратегии для создания этих структур. Я видел одну стратегию: они будут генерировать таблицу в том же объектном файле, который содержит первую виртуальную функцию в классе.

1
ответ дан 26 November 2019 в 20:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: