Рассмотрим два класса
class A{
public:
int i;
A(){}
explicit A(const int ii):i(ii){}
virtual ~A(){
cout<<"~A - "<< i <<endl;
}
virtual void inc(){
i++;
cout<<"i: "<<i<<endl;
}
};
class B: public A{
public:
int j;
B(){}
explicit B(const int jj, const int ii=-1):A(ii), j(jj){}
~B(){
cout<<"~B - "<<i<<", "<<j<<endl;
}
void inc(){
A::inc();
j++;
cout<<"j: "<<j<<endl;
}
};
Теперь мы можем сделать это в main()
:
A *pa = new B();
//...
pa->inc(); // implements B::inc();
Теперь версия использует boost
библиотека
boost::shared_ptr<A> pa = boost::make_shared<B>(2);
//...
pa->inc(); // implements B::inc();
Мой вопрос, в использовании boost
версия, является ли это приемлемым для использования таким образом, то есть обе версии могут использоваться одинаково, или мне нужно сделать что-то дополнительное (я не знаю много внутренних деталей boost)
Есть несколько вещей, которые вы не можете сделать с помощью умных указателей:
Кроме того, вы можете обрабатывать умный указатель, как любой другой указатель, включая вызов виртуальных функций, и все будет правильно.
PS. Если возможно, я рекомендую вам перейти на интеллектуальные указатели C ++ 11. Они были «вдохновлены» (то есть более или менее прямо скопированы) умными указателями Boost, поэтому все, что вам действительно нужно сделать, это включить <memory>
заголовочный файл и изменить, например, boost::shared_ptr
в std::shared_ptr
, Смотрите, например этот справочный сайт.
Других решений пока нет …