begin process at 2012 05 29 01:31:22
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Divers

 > 

C++ Classe virtuelle et héritage


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

C++ Classe virtuelle et héritage

vendredi 10 juin 2005 à 15:43:52 | C++ Classe virtuelle et héritage

freepouy18

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.

vendredi 10 juin 2005 à 16:11:15 | Re : C++ Classe virtuelle et héritage

vecchio56

Administrateur CodeS-SourceS
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
vendredi 10 juin 2005 à 18:56:50 | Re : C++ Classe virtuelle et héritage

ymca2003

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).
lundi 13 juin 2005 à 14:50:26 | Re : C++ Classe virtuelle et héritage

freepouy18

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


 

lundi 13 juin 2005 à 14:54:44 | Re : C++ Classe virtuelle et héritage

freepouy18

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.
lundi 13 juin 2005 à 15:34:03 | Re : C++ Classe virtuelle et héritage

freepouy18

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 ymca2003

lundi 13 juin 2005 à 17:01:14 | Re : C++ Classe virtuelle et héritage

ymca2003

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)
lundi 13 juin 2005 à 17:22:06 | Re : C++ Classe virtuelle et héritage

freepouy18

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)" (?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
lundi 13 juin 2005 à 17:25:12 | Re : C++ Classe virtuelle et héritage

ymca2003

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;
}


Cette discussion est classée dans : classe, char, virtual, virtuelle, mastruct


Répondre à ce message

Sujets en rapport avec ce message

AIDE POUR LA CLASSE REGISTRE UTIL [ par retaks666 ] on pourrai mexpliker clairement svp comment recuperer une valur texte et le stricker dans une variable char stp..apr exemple dans HKEY_CURRENT_USER, j return tableau de caracteres en C++ [ par sozer2 ] Bonjour j'aimerai savoir comment retourner correctement un tableau de caractère en C++Voici mon code qui contient une erreur au niveau du return et au Classe en c++ [ par aciid_washor ] Bonjour, j'essaye de créé une classe donnee qui comporterait un nom et un numéroJe déclare donc:class donnee{ public: char nom; char num Structure dans une classe [ par briscard ] Hello world!!A ton le droit de passer une structure du type: struct { char *Gamma = new char[3]; char *Phase = new char[3]; }donnee;dans u Pointeur et objet ET collection d'objet [ par MrKribou ] En fait je savais pas trop quoi mettre comme titre pour pas copier :pBon je vous explique mon probleme (j'ai pas le source de ce probleme sous la main Parametre sur la ligne de commande [ par payen ] Salut a tous,j'ai un petit souci en C++ ...alors voila : j'ai ecrit un code qui prend comme parametres sur la ligne de commande 2 entiers. Ensuite, pl consultation [ par arbitre04 ] S.V.Pon suppose qu'on est dans le cadre de l'héritage multiple (classe de base A, classe B hérite de A, classe C hérite de B) :- comment déclarer une HELLP ME FOR MY PTI [ par dj_ricom ] Je suis actuellement en première année BTS IG et je souhaite réaliser un PTI sur la gestion d'une école notament en ce qui concerne les notes des elev STL vector et tableau [ par cybermax62 ] j'ai une petite question sur la classe template vector. je sais que c'est possible d'initiliser un vector avec un tableau point de vue C (char[]). j'a char + int dans un tableau d'unsigned char [ par sevenace ] Bonjour, Voici ce que je rentre à ma classe: Carte C("Nom", "Prenom", 14, 12, 3, 14, 30, 0)      //Nom & Prenom -> char Nom[32] & Prenom[32] (attrib


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,030 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales