boost :: shared_ptr и динамическое приведение - PullRequest
15 голосов
/ 25 ноября 2010

У меня проблема с использованием 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
     }

};

Ответы [ 4 ]

19 голосов
/ 25 ноября 2010

см. static_cast с надстройкой :: shared_ptr?

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

4 голосов
/ 25 ноября 2010

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

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

1 голос
/ 25 ноября 2010

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

0 голосов
/ 25 ноября 2010

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

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

...