Безопасно ли использовать такое умное приведение указателей? - PullRequest
2 голосов
/ 05 декабря 2011

Безопасно ли использовать такое умное приведение указателей?

APtr a(new A());
BPtr & b = (Bptr&)a; // this is it

есть

class A
{
public:
   virtual ~A(){}
   virtual void methodA() = 0;
}
typedef std::tr1::shared_ptr<A> APtr;

class B : public A
{
public:
   virtual ~B(){}
   virtual void methodB() = 0;
}
typedef std::tr1::shared_ptr<B> BPtr;

/////////////////////////////////////////////////////////////////////////////////

BPtr & b = a; //this way doesn't work

Ответы [ 3 ]

5 голосов
/ 05 декабря 2011

Чтобы уменьшить интеллектуальный указатель, вы должны использовать функции xxxx_pointer_cast, например, статическое приведение

BPtr b = std::tr1::static_pointer_cast<B>(a);

или динамическое приведение

BPtr b = std::tr1::dynamic_pointer_cast<B>(a);
1 голос
/ 05 декабря 2011

РЕДАКТИРОВАТЬ: Пересмотр этого ответа (поскольку он выкопан снова и прошло много времени).

Классы A и B могут иметь отношение наследования, но shared_ptr<A> и shared_ptr<B> - нет.shared_ptr является классом шаблона, и создание экземпляра шаблона с A не связано с созданием экземпляра с B.

Использование C-подобного приведения (или reinterpret_cast) работает, но только потому, что вы выполняете реинтерпретацию базовых битов.dynamic_cast в двух разных экземплярах shared_ptr завершится ошибкой, поскольку вы не разыгрываете унаследованные указатели, а пытаетесь разыграть умные указатели, которые являются совершенно разными и несовместимыми типами.

На ваш заданный вопрос ответ (все еще) нет.

1 голос
/ 05 декабря 2011

Безопасно это или нет - это другой вопрос.Это определенно необычно и не всегда возможно назначить смарт-ссылку на ссылку другого типа, когда также принудительно пытается сделать его тупой указатель.

Я думаю, вам нужно сначала выяснить, что это за тип.А потом.Что ж, ответ на ваш будущий вопрос, если вы будете настаивать на этом, скорее всего, будет «нет».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...