web-dev-qa-db-fra.com

C++ Undefined Référence à vtable et à l'héritage

Fichier A.h

#ifndef A_H_
#define A_H_

class A {
public:
    virtual ~A();
    virtual void doWork();
};

#endif

Fichier 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

Et Child.cpp 

#include "Child.h"

Child::Child(){
    x = 5;
}

Child::~Child(){...}

void Child::doWork(){...};

Le compilateur dit qu'il existe une référence non définie à vtable pour A. J'ai essayé beaucoup de choses différentes, mais aucune n'a fonctionné.

Mon objectif est que la classe A soit une interface et sépare le code d'implémentation des en-têtes.

27
rjmarques

Pourquoi l'erreur et comment la résoudre? 

Vous devez fournir définitions pour toutes les fonctions virtuelles dans class A. Seules les fonctions virtuelles pures sont autorisées à ne pas avoir de définitions. 

i.e: Dans class A les deux méthodes: 

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

devrait être défini (devrait avoir un corps) 

par exemple.: 

A.cpp

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

Caveat:
Si vous voulez que votre class A agisse comme une interface (a.k.a Classe abstraite en C++), vous devez alors rendre la méthode pure virtuelle.

virtual void doWork() = 0;

Bonne lecture:

Qu'est-ce que cela signifie que la "table virtuelle" est un externe non résolu?
Lors de la construction de C++, l'éditeur de liens indique que mes constructeurs, destructeurs ou tables virtuelles ne sont pas définis.

66
Alok Save

Dans ce cas, faites en sorte que le membre fonctionne comme pur virtuel dans la classe A.

Extrait de code.

class A {
  // ...
  virtual void doWork() = 0;
};
6
Mahesh

Assurez-vous de supprimer tous les fichiers "* .gch" si aucune des autres réponses ne vous aide.