Heritage

Signaler
Messages postés
2
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
17 décembre 2006
-
Messages postés
2
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
17 décembre 2006
-
salut tout le monde,

voici mon problème:
j'ai les classes suivantes: 
Personne
{
.....
virtuel void afficher();
}

Salarie : public Personne
{
.........................
   void afficher();
........................
}

Directeur : public Salarie
{
.........................
 void afficher();
}

avec l'outils de dev KDEV:
il n'y a pas de problème si j'elimine Directeur.
avec Directeur, le compilateur genere une erreur sur le vtab (tout va bien si le mis afficher en commentaire), portant je l'ai declaré virtuel dans Personne.
merci de me repondre.
cordialement.

4 réponses

Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
Salarie : public Personne
{
.........................
   void afficher();
........................
}

Par défaut, afficher() est ici private.
Ton héritage est public, donc pas d'accès.
(à moins que tu n'ai pas tout mis dans l'exemple) 
de plus je pense qu'il faut remettre virtual ici.
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
0u plus simplement, dérives Directeur de Personne et pas de Salarie.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
9
Le mot-clé virtual irait sans doute mieux que virtuel
Il faut répéter virtual dans Salarie::afficher aussi

_____________________________________
Un éditeur de ressources gratuit pour Windows
Messages postés
2
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
17 décembre 2006

salut,
la declaration de la méthode afficher() est public aussi virtual.
j'ai trouvé une solution, mais un peu compliquer;
j'ai ajouté la methode dans la classe Personne la declaration suivante:
virtual Personne* clone() const=0;
ensuite dans les autres:
Salarie:
 Salarie* clone() const { return new Salarie()};
Directeur:
  Directeur* clone() const { return new Directeur()};
Commercial:
Commercial* clone() const { return new Commercial()};
de cette façon tout va bien.
cordialement.