Problème d'héritage

Le
Michael
Bonsoir à tous,

pourquoi est-ce que le code suivant ne compile pas?

class b
{};

class d1 : public b
{}

class d2 : public b
{}

class Manager
{
public:
b* GetClass() { return new b(); }
}


Manager m;
d1 * d = m.GetClass();

BCB6 me donne:

[C++ Error] Unit1.cpp(47): E2034 Impossible de convertir 'b *' en 'd1 *'

Pourtant d1 hérite de b??????

Merci d'avance

Mike
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Fabien LE LEZ
Le #308312
On 03 Jul 2007 19:58:36 GMT, Michael
[C++ Error] Unit1.cpp(47): E2034 Impossible de convertir 'b *' en 'd1 *'

Pourtant d1 hérite de b


Oui, d1 hérite de b, donc tout objet de classe d1 est un objet de
classe b.
Ce qui ne veut pas dire que tout objet de classe b soit un objet de
classe d1.

Si toi, tu es sûr que le pointeur en question pointe vers un d1,
utilise dynamic_cast<> pour donner cette information au compilateur.

??????


Ton clavier est endommagé : la touche "?" est coincée.
Je t'invite à en acheter un autre :
http://www.clubic.com/comparer-prix/clavier/3-1-0.html

Michael
Le #308311
Pourtant d1 hérite de b


Oui, d1 hérite de b, donc tout objet de classe d1 est un objet de
classe b.
Ce qui ne veut pas dire que tout objet de classe b soit un objet de
classe d1.

Si toi, tu es sûr que le pointeur en question pointe vers un d1,
utilise dynamic_cast<> pour donner cette information au compilateur.


Je voulais juste éviter la création de 2 fonctions dans Manager:

d1 * GetD1() { return new d1(); }
d2 * GetD2() { return new d2(); }

Mais je peux faire comme ça, c'est pas un souci finalement...

??????


Ton clavier est endommagé : la touche "?" est coincée.
Je t'invite à en acheter un autre :
http://www.clubic.com/comparer-prix/clavier/3-1-0.html


OOOKKKK, mmerrcciii duu connseillll

^^


Michael
Le #308310
Finalement:

template <class T>
T * GetQuery()
{
return new T(conString);
}
Sylvain
Le #308980
Michael wrote on 03/07/2007 22:45:
Finalement:

template <class T>
T * GetQuery()
{
return new T(conString);
}


en gardant le modèle d'origine, et en supposant que les classes d1 et d2
soient polymorphes (implémentent des virtuels défini par b), le seul
changement:

b* d = m.GetClass();

permettait de régler le pb.

Sylvain.

Michael
Le #308978
en gardant le modèle d'origine, et en supposant que les classes d1 et d2
soient polymorphes (implémentent des virtuels défini par b), le seul
changement:

b* d = m.GetClass();

permettait de régler le pb.


Oui je sais, mais d1 et d2 ont des fonctions qui ne sont pas définies
initialement dans b et que je veux garder spécifiques...

Michael
Le #308977
Finalement:

template <class T>
T * GetQuery()
{
return new T(conString);
}



Comment utiliser une boost::STATIC_ASSERT pour vérifier que T est bien de
type d1 ou d2?

Falk Tannhäuser
Le #308962
Michael schrieb:
template <class T>
T * GetQuery()
{
return new T(conString);
}


Comment utiliser une boost::STATIC_ASSERT pour vérifier que T est bien de
type d1 ou d2?


#include #include
...


BOOST_STATIC_ASSERT((boost::is_same<T, d1>::value ||
boost::is_same<T, d2>::value));

Falk


James Kanze
Le #308959
On Jul 4, 4:58 pm, Michael
en gardant le modèle d'origine, et en supposant que les classes d1 et d2
soient polymorphes (implémentent des virtuels défini par b), le seul
changement:

b* d = m.GetClass();

permettait de régler le pb.


Oui je sais, mais d1 et d2 ont des fonctions qui ne sont pas définies
initialement dans b et que je veux garder spécifiques...


Il y a une chose que je n'arrive pas trop à comprendre. Tu te
trouves quelque part dans le code, et tu veux créer un objet.
D'un type connu, ou non ? Si l'appelant de GetClass() sais ce
qu'il veut créer, où est le problème de définir deux fonctions,
getD1() et getD2(), et appeler celle qui convient. Et s'il ne
sait pas, si la décision est prise quelque part dans getClass()
(qui doit en fait s'appeler getObject(), ou getInstance()),
alors, comment est-ce que l'appelant puisse faire autrement que
ne travailler qu'avec la base ?

--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Michael
Le #308873
Il y a une chose que je n'arrive pas trop à comprendre. Tu te
trouves quelque part dans le code, et tu veux créer un objet.
D'un type connu, ou non ? Si l'appelant de GetClass() sais ce
qu'il veut créer, où est le problème de définir deux fonctions,
getD1() et getD2(), et appeler celle qui convient. Et s'il ne
sait pas, si la décision est prise quelque part dans getClass()
(qui doit en fait s'appeler getObject(), ou getInstance()),
alors, comment est-ce que l'appelant puisse faire autrement que
ne travailler qu'avec la base ?


Tu as tout à fait raison, je me suis embrouillé pour rien.

Je sais à tout moment quel type de classe je suis censé récupérer, le
problème ne se pose donc absolument pas...

Michael
Le #308872
#include #include
...


BOOST_STATIC_ASSERT((boost::is_same<T, d1>::value ||
boost::is_same<T, d2>::value));


Merci.

J'avais trouvé ça:

BOOST_STATIC_ASSERT((boost::is_base_and_derived<b,T>::value));

Publicité
Poster une réponse
Anonyme