Boost:: shared_ptr и динамическая трансляция

У меня проблема с использованием shared_ptr базового класса, я, похоже, не могу вызвать методы производного класса при разыменовании. Я считаю, что код будет более подробным, чем я:

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
     }

};

Ответы

Ответ 1

см. static_cast с boost:: shared_ptr?

вам нужно будет использовать dynamic_pointer_cast, чтобы получить соответствующий экземпляр shared_ptr. (что соответствует a dynamic_cast)

Ответ 2

Общий указатель или нет, если у вас есть указатель на Base, вы можете вызывать только функции-члены из Base.

Если вам действительно нужно dynamic_cast, вы можете использовать dynamic_pointer_cast из boost, но, скорее всего, вы не должны, Вместо этого подумайте о своем дизайне: Derived - это Base, и это очень сильные отношения, поэтому тщательно подумайте о интерфейсе Base, и если конкретный тип действительно должен быть известен.

Ответ 3

Если производный метод не объявлен в базовом классе (виртуальный или нет), то это нормально, что компиляция завершилась неудачно. Общий ptr знает и использует базовый класс (через его указатель) и ничего не знает о производном классе и его конкретных методах.

Ответ 4

Ваш код не будет работать даже с необработанными указателями.

Вам нужно либо объявить метод derivedMethod() даже в базовом классе, либо иметь указатель на объект Derived.