Copiar instancias de clases derivadas a partir de punteros de clases base polimórficos
Para muchos, este enigma de programación ha resultado difícil de resolver. Exploremos las complejidades involucradas y descubramos una solución eficiente.
Considere el siguiente escenario: tiene clases Base, Derived1, Derived2, etc., donde las clases Derived heredan de Base. Dado un puntero a un objeto Base, el objetivo es crear una copia asignada dinámicamente del objeto Derivado subyacente, evitando problemas como "remitente de un objeto temporal".
Tradicionalmente, esto se ha abordado mediante una letanía de typeids odynamic_casts dentro de declaraciones condicionales. Sin embargo, buscamos una solución más elegante.
Método de clonación virtual
La clave está en introducir un método de clonación virtual() en la clase Base, implementado para cada Derivado tipo. Este método devuelve una copia del objeto. Si Base no es abstracta, puede invocar su constructor de copia, pero este enfoque conlleva el riesgo de dividirse si no se implementa correctamente en las clases derivadas.
Idioma CRTP para reutilización de código
Para evitar la duplicación de código, se puede emplear el modismo CRTP (Patrón de plantilla curiosamente recurrente). Considere la siguiente plantilla genérica:
templateclass DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast (*this)); } };
Al utilizar esta plantilla, varias clases derivadas pueden heredar de DerivationHelper e implementar el método clone() usando sus respectivos constructores de copia.
Implementación y ventajas
Esta solución ofrece varios beneficios:
Al adoptar el método virtual clone() y el lenguaje CRTP, los programadores pueden lograr efectivamente la funcionalidad deseada sin la necesidad de complicados o enfoques propensos a errores.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3