"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como criar cópias de instâncias de classes derivadas de ponteiros de classes base polimórficas: uma solução usando métodos de clone virtual e CRTP

Como criar cópias de instâncias de classes derivadas de ponteiros de classes base polimórficas: uma solução usando métodos de clone virtual e CRTP

Publicado em 2024-11-07
Navegar:391

How to Create Copies of Derived Class Instances from Polymorphic Base Class Pointers: A Solution Using Virtual Clone Methods and CRTP

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 virtual

A 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ódigo

Para evitar a duplicação de código, o idioma CRTP (Curiosamente Recurring Template Pattern) pode ser empregado. Considere o seguinte modelo genérico:

template classe DerivationHelper: base pública { público: Base virtual* clone() const { return new Derived(static_cast(*this)); } };

template 
class DerivationHelper : public Base
{
public:
  virtual Base* clone() const
  {
    return new Derived(static_cast(*this));
  }
};

Implementação e vantagens

Esta solução oferece vários benefícios:

Simplicidade: o código é conciso e fácil de implementar.
  • Extensibilidade: adicionar novas classes derivadas não requer modificação da classe base.
  • Desempenho: chamadas de funções virtuais são relativamente eficientes.
  • Ao adotar o método virtual clone() e o idioma CRTP, os programadores podem efetivamente alcançar a funcionalidade desejada sem a necessidade de tarefas complicadas ou abordagens propensas a erros.
Tutorial mais recente Mais>

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