Como escribió a Scott Myers, usted puede tomar ventaja de una relajación en el tipo de sistema C++ 's para declarar clone() para devolver un puntero al tipo real de ser declarado:¿Cuál es la mejor firma para clonar() en C++?
class Base
{
virtual Base* clone() const = 0;
};
class Derived : public Base
{
virtual Derived* clone() const
};
El compilador detecta que el clon() devuelve un puntero al tipo del objeto, y permite que Derived lo anule para devolver un puntero a derivado.
Sería deseable tener clone() devuelve un puntero inteligente que implica la transferencia de la semántica de propiedad, como la siguiente:
class Base
{
virtual std::auto_ptr<Base> clone() const = 0;
};
class Derived : public Base
{
virtual std::auto_ptr<Derived> clone() const;
};
Por desgracia, la relajación de las convenciones no se aplica a los punteros inteligentes con plantilla, y el compilador no permitirá la anulación.
Por lo tanto, parece que me quedo con dos opciones:
- que el Clon() devuelve un puntero "tonto", y el documento que los clientes son responsables de la eliminación de la misma.
- Haga que clone() devuelva un puntero de base inteligente, y haga que los clientes usen dynamic_cast para guardarlos en un puntero Derivado si lo necesitan.
¿Se prefiere uno de estos enfoques? ¿O hay una manera para que yo pueda comer mi semántica de transferencia de propiedad y tener mi fuerte seguridad también?
En realidad, esto provocó lo que quería decir - que podría llamar directamente nuevo con el constructor de copia cuando necesitaba esa clase en particular. – JohnMcG