Estoy usando C++. C++ 0x con Visual Studio 2010 para ser correcto.¿Cómo se comportan los punteros inteligentes no intrusivos con respecto a la herencia y la herencia múltiple?
Supongamos que tengo una clase Z. Para que sea más seguro en mi aplicación trabajar con punteros a esta clase, puedo usar punteros inteligentes (puntero compartido, puntero débil).
Ahora esta clase Z hereda de una clase X. Algunas partes de mi solicitud trabajarán con punteros a la clase X, otros trabajarán con punteros a clase Z.
- ¿Puedo utilizar punteros inteligentes?
- ¿Los punteros compartidos aún funcionan si tengo alguno que se refiera a X y a otros que se refieran a Z? ¿Se garantiza que la destrucción del último puntero compartido a la instancia (independientemente de si es
std::shared_ptr<X>
ostd::shared_ptr<Z>
) elimina la instancia? ¿Estoy seguro de que si borrostd::shared_ptr<X>
, la instancia se conservará mientras haya otrastd::shared_ptr<Y>
?
Ahora supongamos que utilizo la herencia múltiple, en el que Z hereda de clases X e Y. Algunas partes de mi aplicación funcionará con std::shared_ptr<X>
, otros con std::shared_ptr<Y>
y otros con std::shared_ptr<Z>
.
- ¿Puedo seguir utilizando punteros compartidos de esta manera?
- ¿Todavía se garantiza que solo el último puntero inteligente (independientemente de si apunta a X, Y o Z) elimina la instancia?
Por cierto, ¿cómo puedo lanzar con seguridad un puntero inteligente a otro, p. emitir std::shared_ptr<Z>
a std::shared_ptr<X>
? ¿Esto funciona? Está permitido?
Observe que me refiero explícitamente a punteros no intrusivos (como el nuevo std::shared_ptr
y std::weak_ptr
en C++ 0x). Al usar punteros intrusivos (como en Boost), probablemente funcione ya que la instancia en sí es responsable de mantener el contador.
Wow nunca oído hablar de este ... O__O No se hace referencia a esto en cualquier recurso que pude encontrar en C++ 0x que no sea el (indigest) proyecto ... – Klaim
No sabía a ciencia cierta los moldes donde estaba hasta que lo busqué. Sin embargo, sospeché fuertemente que estaban allí ya que formaban parte de la biblioteca Boost.Smartptr original. –
Deshágase de "std ::" delante de los operadores de conversión incorporados.Además, un modelo dinámico de este tipo requiere clases polimórficas. Tus clases de ejemplo no son polimórficas. – sellibitze