Question

J'ai un problème à l'aide d'un shared_ptr d'une classe de base, je ne peux pas sembler être en mesure d'appeler les méthodes de la classe dérivée quand il déréférencement. Je crois que le code sera plus bavard 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
     }

};
Était-ce utile?

La solution

voir static_cast avec boost :: shared_ptr

vous devrez utiliser dynamic_pointer_cast pour obtenir le instanciation shared_ptr approprié. (Correspondant à une dynamic_cast)

Autres conseils

pointeur partagé ou non, lorsque vous avez un pointeur vers un Base, vous ne pouvez appeler des fonctions membres de Base.

Si vous avez vraiment besoin de dynamic_cast, vous pouvez utiliser dynamic_pointer_cast de stimuler , mais les chances sont que vous ne devriez pas. Au lieu de cela, pensez à votre conception. Derived est un Base , ce qui est une relation extrêmement forte, donc bien réfléchir à l'interface Base et si le type de béton a vraiment être connu

Si derivedMethod n'est pas déclarée dans la classe de base (virtuelle ou non), alors il est normal que la compilation échouerait. Le PTR partagé connaît et utilise la classe de base (via le pointeur qu'elle détient), et ne sait rien de la classe dérivée et ses méthodes spécifiques.

Votre code ne fonctionne même avec des pointeurs premières.

Vous avez besoin soit de déclarer méthode derivedMethod() même en classe de base ou d'avoir un pointeur vers l'objet aDerived.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top