C ++ Undefined Ссылка на vtable и наследование - PullRequest
29 голосов
/ 23 февраля 2012

Файл Ах

#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(){...};

Компилятор говорит, что существует неопределенная ссылка наvtable для A.Я пробовал много разных вещей, но ни одна из них не сработала.

Моя цель - чтобы класс A был интерфейсом и отделил код реализации от заголовков.

Ответы [ 3 ]

68 голосов
/ 23 февраля 2012

Почему ошибка и как ее устранить?

Вам необходимо предоставить определений для всех виртуальных функций в class A.Только чисто виртуальные функции могут не иметь определений.

т.е.: в class A должны быть определены оба метода:

virtual ~A();
virtual void doWork();

(должен иметь тело)

например:

A.cpp

void A::doWork()
{
}
A::~A()
{
}

Предупреждение:
Если вы хотите, чтобы ваш class A действовал как интерфейс (он же Абстрактный класс в C ++), тогда вы должны сделать метод чисто виртуальным.

virtual void doWork() = 0;

Good Read:

Что означает, что «виртуальная таблица» является неразрешенной внешней?
При сборке C ++ компоновщик говорит, что мои конструкторы, деструкторы или виртуальные таблицы не определены.

6 голосов
/ 23 февраля 2012

Моя цель состоит в том, чтобы A был интерфейсом и отделил код реализации от заголовков.

В этом случае сделайте функцию-член чисто виртуальной в классе А.

class A {
  // ...
  virtual void doWork() = 0;
};
2 голосов
/ 11 июня 2014

Обязательно удалите все файлы "* .gch", если ни один из других ответов не поможет вам.

...