auto_ptr
не ведет себя так же, как указатель в этом отношении. В языке существуют специальные правила, позволяющие Shape*
быть static_cast до Circle*
, когда Circle
происходит от Shape
. Понижение не является полностью безопасным для типов, так как он полагается на пользователя, чтобы предоставить значение указателя, которое фактически указывает на подобъект базового класса Shape
в Circle
, но стандарт допускает это для удобства. auto_ptr
"просто" класс библиотеки и не имеет эквивалентного преобразования.
Даже если бы вы могли это сделать, это часто давало бы сбои. При копировании auto_ptr
оригинал теряет право собственности на ресурс. Ваш static_cast
будет скопировать auto_ptr
во временное состояние, и поэтому aS
будет сброшен, и ресурс будет уничтожен, когда временное значение равно (в конце выражения). В вашем примере это нормально, так как он все равно будет уничтожен на return
, но, вообще говоря, вы не хотите копировать auto_ptr
кроме как в параметре вызова функции или возвращаемом значении, чтобы указать передачу владения от вызывающего к вызываемому. или наоборот.
Вместо этого вы можете static_cast<Circle*>(aS.get())->GetRadius()
, или, что еще лучше, реструктурировать свой код, чтобы избежать необходимости снижения производительности. Если вы знаете, что ваш объект Circle
, сохраните его в auto_ptr<Circle>
[*]. Если вы держите его в auto_ptr<Shape>
, то не полагайтесь на то, что он Circle
.
[*] Или, если ваша реализация предоставляет их, лучший умный указатель, такой как unique_ptr
, scoped_ptr
или shared_ptr
. Даже если ваша реализация их не предоставляет, есть Boost.