Ответ 1
см. static_cast с boost:: shared_ptr?
вам нужно будет использовать dynamic_pointer_cast, чтобы получить соответствующий экземпляр shared_ptr
. (что соответствует a dynamic_cast
)
У меня проблема с использованием 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
}
};
см. static_cast с boost:: shared_ptr?
вам нужно будет использовать dynamic_pointer_cast, чтобы получить соответствующий экземпляр shared_ptr
. (что соответствует a dynamic_cast
)
Общий указатель или нет, если у вас есть указатель на Base
, вы можете вызывать только функции-члены из Base
.
Если вам действительно нужно dynamic_cast
, вы можете использовать dynamic_pointer_cast
из boost, но, скорее всего, вы не должны, Вместо этого подумайте о своем дизайне: Derived
- это Base
, и это очень сильные отношения, поэтому тщательно подумайте о интерфейсе Base
, и если конкретный тип действительно должен быть известен.
Если производный метод не объявлен в базовом классе (виртуальный или нет), то это нормально, что компиляция завершилась неудачно. Общий ptr знает и использует базовый класс (через его указатель) и ничего не знает о производном классе и его конкретных методах.
Ваш код не будет работать даже с необработанными указателями.
Вам нужно либо объявить метод derivedMethod()
даже в базовом классе, либо иметь указатель на объект Derived
.