С++ Undefined Ссылка на vtable и наследование
Файл A.h
#ifndef A_H_
#define A_H_
class A {
public:
virtual ~A();
virtual void doWork();
};
#endif
Файл Child.h
#ifndef CHILD_H_
#define CHILD_H_
#include "A.h"
class Child: public A {
private:
int x,y;
public:
Child();
~Child();
void doWork();
};
#endif
И Child.cpp
#include "Child.h"
Child::Child(){
x = 5;
}
Child::~Child(){...}
void Child::doWork(){...};
Компилятор говорит, что существует ссылка undefined на vtable для A
.
Я пробовал много разных вещей, но никто не работал.
Моя цель состоит в том, чтобы класс A
являлся интерфейсом и разделял код реализации из заголовков.
Ответы
Ответ 1
Почему ошибка и как ее решить?
Вам необходимо предоставить определения для всех виртуальных функций в class A
. Только чистые виртуальные функции не имеют определений.
i.e: В class A
оба метода:
virtual ~A();
virtual void doWork();
должен быть определен (должен иметь тело)
например:
a.cpp
void A::doWork()
{
}
A::~A()
{
}
Протест:
Если вы хотите, чтобы ваш class A
выступал в качестве интерфейса (aka Абстрактный класс на С++), вы должны сделать метод чистый виртуальный.
virtual void doWork() = 0;
Хорошее чтение:
Что означает, что "виртуальная таблица" является нерешенным внешним?
При создании С++ компоновщик говорит, что мои конструкторы, деструкторы или виртуальные таблицы undefined.
Ответ 2
Моя цель состоит в том, чтобы A был интерфейсом и отделял код реализации от заголовков.
В этом случае сделайте функцию-член чистой виртуальной в классе А.
class A {
// ...
virtual void doWork() = 0;
};
Ответ 3
Обязательно удалите любые файлы "*.gch", если ни один из ответов не поможет вам.