Polymorphisme et Tableau

Résolu
cs_benroger Messages postés 1 Date d'inscription dimanche 6 novembre 2005 Statut Membre Dernière intervention 30 août 2006 - 30 août 2006 à 10:46
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 - 30 août 2006 à 12:19
Bonjour à tous,

Je travaille actuellement sous Visual 2003.net, sous Windows XP.


J'ai developpé en C ++ une application SDI qui utilise une classe mère CMere qui contient une fonction virtuelle pure void Infos(void). J'ai également une classe CFille dérivée de CMere dans laquelle je définis la fonction void Infos(void).

Ces 2 classes sont utilisées dans une fonction du Document. Dans cette fonction, j'alloue un tableau t de CFille. Voici le code de cette fonction :


void CEssaiDoc::OnTest()


{


CMere* t;


t= new CFille[3];



for
(

int
i=0;i<3;i++)



t[i].Infos();



delete
[] t;



}

Comme vous le voyez, ça n'a pas l'air bien méchant, mais à l'éxecution du programme, j'observe une erreur dans la boucle sur i :
Pour i = 0 : Tout se passe bien
Pour i = 1 : Erreur de lecture dans la mémoire.

Comme on peut s'en douter, ma question est d'où vient cette erreur ? Pourquoi, lorsque j'utilise le polymorphisme je n'arrive pas à utiliser correctement un tableau de CFille ?

Merci pour vos réponses ! J'espère avoir été complet dans me description, mais soyez indulgents, ce n'est jamais que mon premier message !

PS :
Pour information voici les codes sources (tres courts) des classes meres et filles :

Mere.h :



#pragma
once


class CMere


{



private



:


int
m_fc;


int
m_C;


public



:CMere(


void
);~CMere(


void
);


virtual



void
Infos() =0;};






Mere.cpp :#include

"StdAfx.h"
#include

".\mere.h"CMere::CMere(

void){

}

CMere::~CMere(

void){

}

Fille.h :

#pragma

once#include

"mere.h"
class

CFille:

public CMere{

public

:CFille(

void);~CFille(

void);

void Infos();
private

:

int m_fc;

int m_C;};

Fille.cpp :

#include

"StdAfx.h"
#include

".\fille.h"CFille::CFille(

void){

}

CFille::~CFille(

void){

}

void

CFille::Infos(){

}

5 réponses

luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
30 août 2006 à 12:13
Oui pardon :)
3
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
30 août 2006 à 11:52
Salut;

Essaye :

for(int i=0;i<3;i++)
{
t[i].Infos();
}
delete [] t;

En .net je ne sais pas mais en C++ les {} sont nécessaires, à moins d'écrire sur la même ligne.
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
30 août 2006 à 12:06
Non, les {} ne sont pas nécessaire. C'est comme pour un "if"

if (...) cout << "coucou" << endl;


Mais le polymorphisme fonctionne que sur un pointeur. Car dans ton truc:
CMere* t;


Tu créés un tableau d'objet CMere, et non un tableau de pointeur
d'objet CMere. Mais tu ne peux pas accéder a la fonction virtuelle de
CMere.


Si tu déclares "t" par: CFille * t. Ton truc marchera bien.


Mais si tu veux un tableau de pointeur de CMere:
CMere** t = new CMere*[3];

for (int i = 0 ; i < 3 ; ++i)
t[i] = new CFille();

// Puis on appelle la fonction Infos().

for(
int i=0;i<3;i++)

t[i].Infos();

// Destruction

for(int i= 0 ; i < 3 ; ++i) delete t[i];

delete[] t;

Remarque: quand tu fais de l'héritage, il faut déclarer les destructeurs "virtual".
0
cs_juju12 Messages postés 966 Date d'inscription samedi 3 avril 2004 Statut Membre Dernière intervention 4 mars 2010 4
30 août 2006 à 12:11
Oups la gaffe...désolé.


Par contre il faudrait juste mettre t[i]->Infos() au lieu de t[i].Infos puisque c'est un pointeur.
0

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

Posez votre question
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
30 août 2006 à 12:19
Mais bon je galère aussi avec ces histoires de polymorphisme avec
pointeur ou référence. C'est assez compliqué car ca fonctionne
également:


void Affiche_infos(CMere & _which) // <= ON A UNE REFERENCE LA

{

    _which.Infos();

}

CMere** t = new CMere*[3];

for (int i = 0 ; i < 3 ; ++i)
t[i] = new CFille();

for(
int i=0;i<3;i++)

Affiche_infos(*t[i]);

for(int i= 0 ; i < 3 ; ++i) delete t[i];

delete[] t;


On obtiendra ici le meme résultat (normalement).
0
Rejoignez-nous