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

Fichier A. H

#ifndef A_H_
#define A_H_

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

#endif

Fichier Enfant.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 Enfant.rpc

#include "Child.h"

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

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

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

Le compilateur indique qu'il existe une référence indéfinie à vtable pour A. J'ai essayé beaucoup de choses différentes et pourtant aucun n'a travaillé.

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

26
demandé sur Lightness Races in Orbit 2012-02-23 07:06:45

3 réponses

Pourquoi l'erreur et comment le résoudre?

, Vous devez fournir définitions pour toutes les fonctions virtuelles dans class A. Seules les fonctions virtuelles pures sont autorisées à n'avoir aucune définition.

C'est-à-dire: dans class A les deux méthodes:

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

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

Par exemple:

A.cpp

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

Mise en garde:
Si vous voulez que votre class A agisse comme une interface (alias classe abstraite en C++) alors vous devriez rendre la méthode pure virtuelle.

virtual void doWork() = 0;

Bonne Lecture:

Ce qui 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.

64
répondu Alok Save 2017-05-23 12:10:03

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

Dans ce cas, faites fonctionner le membre en tant que virtuel pur dans la classe A.

class A {
  // ...
  virtual void doWork() = 0;
};
6
répondu Mahesh 2012-02-23 03:12:32

Assurez-vous de supprimer tout "*.gch" fichiers si aucune des autres réponses vous aider.

1
répondu ArchZombie0x Ryan P. Nicholl 2014-06-11 04:49:16