C++ Classe virtuelle et héritage

freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005 - 10 juin 2005 à 15:43
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 - 13 juin 2005 à 17:25
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

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
10 juin 2005 à 16:11
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
10 juin 2005 à 18:56
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).
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
13 juin 2005 à 14:50
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
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
13 juin 2005 à 14:54
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.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
13 juin 2005 à 15:34
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 juin 2005 à 17:01
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)
0
freepouy18 Messages postés 49 Date d'inscription mercredi 20 avril 2005 Statut Membre Dernière intervention 15 septembre 2005
13 juin 2005 à 17:22
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
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 juin 2005 à 17:25
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;
}
0
Rejoignez-nous