Предположим, DerivedClass
является производным от BaseClass
.Будет ли работать следующее?
Да.Так же, как нет ничего плохого в
boost::shared_ptr<BaseClass> pbase(new DerivedClass());
(Предполагая, что в обоих случаях BaseClass имеет виртуальный деструктор.) Интеллектуальный указатель разработан так, чтобы вести себя как простой указатель, насколько это возможно, и обеспечивать то же поведение, что иBaseClass* pbase = new DerivedClass();
, плюс все эти качества управления жизненным циклом.
После этого вопроса я понимаю, что теперь a
указывает на производное и b
указывает на основание (верно?)
Нет, a и b оба указывают на экземпляр DerivedClass.Обмен, на который ссылается связанная статья, происходит на временном объекте внутри operator = .Когда этот временный объект выходит из области видимости, экземпляр BaseClass будет удален.
Кроме того, теперь, если я вызову функцию через a
, будет ли она вызывать производную реализацию?
Да.Если вы посмотрите на реализацию оператора -> , все, что он делает, это возвращает указатель, на который должен быть вызван основной оператор -> :
T * operator-> () const // never throws
{
BOOST_ASSERT(px != 0);
return px;
}
так что поведение такое же, как у простого указателя.