C++ Classe virtuelle et héritage

Signaler
Messages postés
49
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
15 septembre 2005
-
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
-
Bonjour,


Voila, j'ai un souci avec l'utilisation de méthodes virtuelles pures lors de leurs redéfinition dans une sous-classe. voici le code ainsi qu'une petite explication:



=========CLASSE MERE===========
class A
{
public:

struct MaStruct
{
char* ch1;
char* ch2;
};


A(); //constructeur
virtual ~A(); //destructeur


virtual MaStruct* get_info() =0; //méthode virtuelle pure non définie dans le .cpp
};
==============================================



=========CLASSE FILLE=========================
class B
{
public:

struct MaStruct
{
char* ch1;
char* ch2;
};


B(); //constructeur
virtual ~B(); //destructeur


MaStruct* get_info(); //je veux ici renvoyer un tableau de structure
};
==============================================


Erreur générée: error C2555: 'B::get_info' : overriding virtual function differs from 'A::get_info' only by return type or calling convention D:\....\ClasseMere.h : see declaration of 'A'



En fait je veux ici redéfinir ma méthode virtuelle pure mais apparement il y a un problème avec la STRUCTURE MaStruct que je désire renvoyer puisque avec une méthode simple (ex: virtual int mafonction() =0) j'arrive a la redéfinir en codant (int mafonction();)dans la classe fille.



Si qqun pouvait m'aider, ce serait cool


PS : je code sous Visual C++ 6.

8 réponses

Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
8
Tes structures ont la même apparence, mais pour le compilo elles sont
bien différentes. Tu dois définir ce type une seule fois, dans un .h
que tu inclus dans les 2 classes
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Et oui dans un cas c'est A::MaStruct et l'autre B::MaStruct et donc c'est pas pareil.
La structure doit être déclarée une seule, fois par contre tu peux la laisser dans la classe A si elle public ou protected (class B pourra ainsi y accéder par héritage).
Messages postés
49
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
15 septembre 2005

Oui, je sais bien mais le problème c'est que lorsque j'enlève la déclaration de la structure dans la classe B (fille), j'ai une erreur lorsque j'essaye d'utiliser une fonction qui renvoie cette meme structure.

#include <fich_classA.h>

class B
{
public:

B(); //constructeur
virtual ~B(); //destructeur


MaStruct* get_info(); //erreur à ce niveau
};

Sinon j'avais déjà essayer de mettre mes structures dans un autre ".h" mais le problème est toujours le même, je n'arrive pas à déclarer de fonction retournant une de ces structures sans qu'une erreur ne survienne.

Est-ce que je ne dois pas déclarer la structure que je souhaite retourner dans la classe concernée (celle qui contient la méthode qui devrait retourner cette structure)? Ce serai un truc dans ce genre :

=============================================
Strucure.h

struct MaStruct
{
char* ch1;
char* ch2;
};

MaClasse.h

class CMaClasse
{
public:

NE DOIS-JE PAS DECLARER MA STRUCTURE ICI, SI OUI, COMMENT?


CMaClasse(); //constructeur
virtual ~CMaClasse(); //destructeur


virtual MaStruct* get_info() =0; //méthode virtuelle pure non définie dans le .cpp et qui doit retourner ma fameuse structure ERREUR
};
==============================================


Merci de bien vouloir m'aider
Messages postés
49
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
15 septembre 2005

Je voulais aussi présiser que j'ai bien fait le #include "Structure.h" mais aussi que j'avais la même erreur que je déclare un autre ".h" contenant les structures ou que je les déclares dans la classe mère.
Messages postés
49
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
15 septembre 2005

C'est bon j'ai trouvé mon problème!!!!

Je ne savais pas qu'il fallait ajouter le "= 0" à la fin de la déclaration de la méthode redéfinie dans la classe fille....voilà tout

Je donne qd meme un exemple complet de la façon dont j'ai procédé :

=========CLASSE MERE===========
class A
{
public:

struct MaStruct
{
char* ch1;
char* ch2;
};
A(); //constructeur
virtual ~A(); //destructeur


virtual MaStruct* get_info() =0; //méthode virtuelle pure non définie dans le .cpp
};
==============================================



=========CLASSE FILLE=========================
class B : public A
{
public:

B(); //constructeur
virtual ~B(); //destructeur


MaStruct* get_info() =0 ; //redéfinition de la méthode de la classe A
};
== ==============================================

Voilà et Merci a vecchio56 et =88414 ymca2003
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Et en mettant
virtual A::MaStruct* get_info(); (sans le = 0 qui a mon avis ne doit pas être là sinon tu as encore une classe virtuelle pure non instanciable)
Messages postés
49
Date d'inscription
mercredi 20 avril 2005
Statut
Membre
Dernière intervention
15 septembre 2005

Justement ça ne marche pas et voila l'erreur générée :

error LNK2001: unresolved external symbol "public: virtual char * __thiscall B::get_info(void)" ([mailto:?get_rn_ecn_number@CPSA_Word@@UAEPADXZ ?get_rn_ecn_number@CPSA_Word@@UAEPADXZ])
Debug/MonAppli.exe : fatal error LNK1120: 1 unresolved externals

Je ne comprend pas nonplus pourquoi l'application a besoin de ce "=0" mais en tous cas avec, ça fonctionne.

Tu sais, à force d'essayer mille et une façon de régler le problème on est même obligé d'essayer des choses que le compilateur fini par accépter.

Mais je suis bien d'accord avec toi, le "=0" est selon moi attribué aux méthodes virtuelles pures. Mais bon je ne saurais pas dire pourquoi ça marche ainsi...

Si qqun sait, qu'il me fasse signe. Merci
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Cette erreur te dis qu'il manque le code de la fonction c'est pour ça que ça marche avec le =0.
Il faut mettre dans un .cpp :
A::MaStruct* B::get_info()
{
return NULL;
}