С++ 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", если ни один из ответов не поможет вам.