проблема с наследованием - PullRequest
       10

проблема с наследованием

0 голосов
/ 09 января 2011
class OGraph {
public:
    OGraph() { }
    virtual ~OGraph();

    virtual bool is_directed()=0;
};

class OUGraph : public OGraph {
public:
    OUGraph() {  }
    bool is_directed() { return false; }
    ~OUGraph() {}
};

, но когда я делаю это

OUGraph myGraph();
cout << myGraph.is_directed();

, я получаю следующую ошибку:

Неопределенные символы: "typeinfo для OGraph", на которые ссылается: typeinfo для OUGraphinmain.o "vtable for OGraph", на который ссылаются из: OGraph :: OGraph () в main.o mkdir -p dist / Debug / GNU-MacOSX "OGraph :: ~ OGraph ()", на который ссылаются из: g ++ -o dist /Отладка / GNU-MacOSX / сборка opengraph / Debug / GNU-MacOSX / сборка OGraph.o / отладка / GNU-MacOSX / main.o
OUGraph :: ~ OUGraph () в main.o OUGraph :: ~ OUGraph ()в main.o ld: символ (ы) не найдены collect2: ld вернул 1 состояние выхода make [2]: * [dist / Debug / GNU-MacOSX / opengraph] Ошибка 1 make [1]: [.build-conf] Ошибка 2 make: ** [.build-impl] Ошибка 2

BUILD FAILED (значение выхода 2, общее время: 568 мс)

Ответы [ 4 ]

4 голосов
/ 09 января 2011

This:

OUGraph myGraph();

объявляет функцию с именем myGraph, которая возвращает OUGraph.Вместо этого вам нужно иметь:

OUGraph myGraph;

Это объявляет переменную, как вы и собираетесь.

2 голосов
/ 09 января 2011

Это то же самое, на что влюбляются все новые люди на С ++.

OUGraph myGraph();

Вы не создали переменную с именем myGraph, вы объявили функцию myGraph, которая возвращает OUGraph. Удалить "()".

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

1 голос
/ 09 января 2011

У вас нет реализации для virtual ~OGraph();. Либо предоставьте реализацию, укажите ее как чисто виртуальную с = 0;, либо просто избавьтесь от нее.

Компилятор ожидает присоединения информации о типе для класса к реализации его первого виртуального метода. Ваш первый виртуальный метод не определен, поэтому реализация никогда не генерируется, и вы получаете связанные ошибки связывания.

Кроме того, как все говорят, вы должны удалить скобки из вашего определения myGraph.

0 голосов
/ 09 января 2011

Если вы создаете новый объект на основе конструктора 'default', я полагаю, вы вызываете его без пустых скобок.

Итак, вы должны использовать OUGraph myGraph, а не OUGraph myGraph()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...