Я использую C ++.C ++ 0x, используя Visual Studio 2010, чтобы быть корректным.
Предположим, у меня есть класс Z. Чтобы в моем приложении было безопаснее работать с указателями на этот класс, я могу последовательно использовать умные указатели (общий указатель,слабый указатель).
Теперь этот класс Z наследуется от класса X. Некоторые части моего приложения будут работать с указателями на класс X, другие будут работать с указателями на класс Z.
- Могу ли я по-прежнему использовать умные указатели?
- Работают ли общие указатели, если у меня есть некоторые, которые ссылаются на X, а другие - на Z?Гарантируется ли, что уничтожение последнего общего указателя на экземпляр (независимо от того, является ли он
std::shared_ptr<X>
или std::shared_ptr<Z>
) удаляет экземпляр?Уверен ли я, что если я удалю std::shared_ptr<X>
, этот экземпляр будет храниться до тех пор, пока существует еще один std::shared_ptr<Y>
?
Теперь предположим, что я использую множественное наследование, где Z наследуется от классов X иY. Некоторые части моего приложения будут работать с std::shared_ptr<X>
, другие с std::shared_ptr<Y>
и другие с std::shared_ptr<Z>
.
- Могу ли я по-прежнему использовать общие указатели таким образом?
- Все еще гарантируется, что только последний умный указатель (независимо от того, указывает ли он на X, Y или Z) удаляет экземпляр?
Кстати, как я могу безопасно привести один умный указатель к другому?Например, приведение std::shared_ptr<Z>
к std::shared_ptr<X>
?Это работает?Это разрешено?
Обратите внимание, что я явно ссылаюсь на неинтрузивные указатели (как новые std::shared_ptr
и std::weak_ptr
в C ++ 0x).При использовании навязчивых указателей (как в Boost), это, вероятно, работает, поскольку сам экземпляр отвечает за сохранение счетчика.