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.
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.
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;
};
Assurez-vous de supprimer tout "*.gch" fichiers si aucune des autres réponses vous aider.