Polymorphisme et Tableau [Résolu]

Signaler
Messages postés
1
Date d'inscription
dimanche 6 novembre 2005
Statut
Membre
Dernière intervention
30 août 2006
-
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
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

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Oui pardon :)
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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".
Messages postés
966
Date d'inscription
samedi 3 avril 2004
Statut
Membre
Dernière intervention
4 mars 2010
4
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.
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
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).