2015-10-19 1 views
0

Je suis nouveau en C++ et j'apprends actuellement l'héritage. Je ne sais pas comment hériter correctement ma classe abstraite MapItem, je continue à recevoir ces erreurs ..
Comment puis-je hériter de ma classe abstraite?

extrait d'erreur

 hidden overloaded virtual function 'MapItem::tick' declared here: 
      different qualifiers (const vs none) 
       virtual void tick() const = 0; 

     Undefined symbols for architecture x86_64: 
       "Residential::Residential()" 

Il prétend aussi que ma classe Residential est une classe abstraite. Le programme compile et s'exécute avec succès uniquement lorsque j'ajoute le mot clé const à la fonction tick(). Mais calme évidemment, c'est un problème car tick() doit fonctionner sur certaines variables membres de la classe. J'ai correctement inclus tous les fichiers et mon fichier make cible tous les fichiers corrects, ce qui rend cette erreur hors de ma compréhension.

map_item.h

// abstract class 

class MapItem { 
... 
virtual void tick() const = 0; 
} 

residential.h

#ifndef RESIDENTIAL_H 
#define RESIDENTIAL_H 

#include "map_item.h" 

class Residential : public MapItem { 

    private: 
     int capacity; 
     double taxRevenue; 

    public: 
     Residential(); 
     virtual ~Residential(); 
     void tick(); 
     double collectTaxes(); 
}; 

#endif 

residential.cpp

#include "residential.h" 

Residential::Residential() { 
    capacity = 1; 
    taxRevenue = 0.0; 
} 

Residential::~Residential() {} 

void Residential::tick() { 
} 

double Residential::collectTaxes() { 
    taxRevenue = 0.0; 
    return taxRevenue; 
} 

Répondre

0

Votre problème est simplement que Residential vous déclarez et définissez tick comme suit:

void Residential::tick() 

... tandis que la base abstraite a ...

virtual void tick() const = 0; 

Vous devez ajouter le const-Residential::tick, ou le supprimer de Mapitem::tick, ils sont donc cohérents. Vous dites ...

Le programme compile et s'exécute avec succès lorsque j'ajoute le mot-clé const à la fonction tick(). C'est un problème car tick() doit fonctionner sur certaines variables membres de la classe.

... il semble que ce soit ce que vous voulez faire.


Il est aussi une bonne idée d'ajouter override-Residential::tick() afin de le compilateur obligé de vérifier qu'il correspond MapItem::tick():

void Residential::tick() [const] override 
+0

Merci pour la réponse, il s'agit d'une affectation matérielle et l'assignation nécessite que MapItem :: tick() soit une pure fonction virtuelle qui, à mon avis, nécessite le "const = 0;" dans la définition de classe ... ce qui est quelque chose que je ne suis pas exactement sûr à propos de ALSO ... Residential :: tick() ne peut pas être une fonction constante, car il doit fonctionner sur certains membres de la classe. encore une fois im nouveau à C++ donc je ne sais pas quoi faire ici – infetsor

+0

peut-être ma compréhension d'une fonction virtuelle pure est incorrecte. mais à partir de maintenant, il nécessite le const = 0; part – infetsor

+1

@infetsor: "pure virtual" signifie simplement que c'est "virtual" et a le '= 0' ... il n'a pas besoin d'être' const'. Fondamentalement, le virtuel pur marque simplement la fonction comme ayant besoin d'être surchargée dans une classe dérivée avant qu'une instance de classe puisse être instanciée. Il n'y a aucune raison qui devrait avoir une relation à savoir si 'const' de la fonction, et ce n'est pas le cas. –

-1

Déclarant une méthode membre entraîne une déclaration de fonction qui prend implicitement ce pointeur en premier paramètre

Ainsi, une méthode void Residential::tick() (sans le const à la fin) aboutit à une fonction comme void Residential::tick(Residential* this).

Adding const à la fin void Residential::tick() const peut alors être comprise comme une déclaration avec un const ce pointeur:

void Residential::tick(const Residential* this) 

, quand vous déclarez void Residential::tick() const dans la classe de base, puis déclariez void Residential::tick() en classe dérivée, la les signatures de fonction ne correspondent pas et le compilateur renvoie une erreur. Donc, décidez de la signature dont vous avez besoin (const qualifié/non const) et assurez-vous que les deux signatures correspondent.

+0

merci mais je n'ai pas besoin d'une copie de la première réponse. – infetsor