Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Problème d'héritage

10 réponses
Avatar
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

10 réponses

Avatar
Fabien LE LEZ
On 03 Jul 2007 19:58:36 GMT, Michael <michael.at.gmail.dot.com>:

[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

Avatar
Michael
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

^^


Avatar
Michael
Finalement:

template <class T>
T * GetQuery()
{
return new T(conString);
}
Avatar
Sylvain
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.

Avatar
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...

Avatar
Michael
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?

Avatar
Falk Tannhäuser
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 <boost/static_assert.hpp>
#include <boost/type_traits.hpp>

...


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

Falk


Avatar
James Kanze
On Jul 4, 4:58 pm, Michael <michael.at.gmail.dot.com> wrote:
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


Avatar
Michael
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...

Avatar
Michael
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>

...


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