Copiando instâncias de classes derivadas de ponteiros de classe base polimórficas
Para muitos, esse enigma de programação se mostrou ilusório. Vamos explorar as complexidades envolvidas e descobrir uma solução eficiente.
Considere o seguinte cenário: você tem classes Base, Derived1, Derived2, etc., onde as classes Derived herdam de Base. Dado um ponteiro para um objeto Base, o objetivo é criar uma cópia alocada dinamicamente do objeto Derived subjacente, evitando problemas como "endereço de retorno de um temporário". de typeids ou dynamic_casts em instruções condicionais. No entanto, buscamos uma solução mais elegante.
Método de clone virtualA chave está na introdução de um método clone() virtual para a classe Base, implementado para cada Derivado tipo. Este método retorna uma cópia do objeto. Se Base não for abstrato, você pode invocar seu construtor de cópia, mas essa abordagem acarreta o risco de fatiamento se não for implementada corretamente nas classes derivadas.
Idioma CRTP para reutilização de códigoPara evitar a duplicação de código, o idioma CRTP (Curiosamente Recurring Template Pattern) pode ser empregado. Considere o seguinte modelo genérico:
template
templateImplementação e vantagensclass DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast (*this)); } };
Esta solução oferece vários benefícios:
Simplicidade: o código é conciso e fácil de implementar.Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3