boost :: shared_ptr et la distribution dynamique
J'ai un problème à l'aide d'un shared_ptr
d'une classe de base, je ne peux pas semblent être en mesure d'appeler la classe dérivée des méthodes de référence. Je crois que le code sera plus bavarde que moi:
class Base : public boost::enable_shared_from_this<Base>
{
public:
typedef boost::shared_ptr<BabelNet> pointer;
};
class Derived : public Base
{
public:
static pointer create()
{
return pointer(new Derived);
}
void anyMethod()
{
Base::pointer foo = Derived::create();
//I can't call any method of Derived with foo
//How can I manage to do this ?
//is dynamic_cast a valid answer ?
foo->derivedMethod(); //-> compilation fail
}
};
source d'informationauteur HolyLa
Vous devez vous connecter pour publier un commentaire.
voir static_cast avec boost::shared_ptr?
vous aurez besoin d'utiliser dynamic_pointer_cast pour obtenir les
shared_ptr
de l'instanciation. (correspondant à undynamic_cast
)Pointeur partagé ou pas, quand vous avez un pointeur vers une
Base
vous pouvez seulement appeler des fonctions de membre deBase
.Si vous avez vraiment besoin de
dynamic_cast
vous pouvez utiliserdynamic_pointer_cast
de stimulermais les chances sont que vous ne devriez pas. Au lieu de cela, pensez à votre design :Derived
est unBase
et c'est une très forte relation, afin de penser soigneusementBase
interface et si le béton de type a vraiment à être connu.Si derivedMethod n'est pas déclarée dans la classe de base (virtuel ou pas), alors il est normal que la compilation échoue. L'partagé ptr connaît et utilise la classe de base (via le pointeur qu'il détient), et ne sait rien à propos de la classe dérivée et ses méthodes spécifiques.
Votre code ne fonctionne pas, même avec des pointeurs.
Vous avez besoin pour déclarer la
derivedMethod()
méthode, même dans la classe de base ou pour avoir un pointeur sur uneDerived
objet.