«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как создать копии экземпляров производных классов из указателей полиморфного базового класса: решение с использованием методов виртуального клонирования и CRTP

Как создать копии экземпляров производных классов из указателей полиморфного базового класса: решение с использованием методов виртуального клонирования и CRTP

Опубликовано 7 ноября 2024 г.
Просматривать:768

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

Копирование экземпляров производных классов из указателей полиморфных базовых классов

Для многих эта загадка программирования оказалась неразрешимой. Давайте рассмотрим связанные с этим сложности и найдем эффективное решение.

Рассмотрим следующий сценарий: у вас есть классы Base, Derived1, Derived2 и т. д., где производные классы наследуются от Base. Учитывая указатель на базовый объект, цель состоит в том, чтобы создать динамически выделяемую копию базового производного объекта, избегая таких проблем, как «обратный адрес временного объекта».

Традиционно это решалось с помощью перечня идентификаторов типов или динамических_приведений в условных операторах. Однако мы ищем более элегантное решение.

Метод виртуального клонирования

Ключ заключается во введении метода виртуального клонирования() в базовый класс, реализованного для каждого производного класса. тип. Этот метод возвращает копию объекта. Если Base не является абстрактным, вы можете вызвать его конструктор копирования, но этот подход несет в себе риск нарезки, если он не реализован должным образом в производных классах.

Идиома CRTP для повторного использования кода

Чтобы избежать дублирования кода, можно использовать идиому CRTP (любопытно повторяющийся шаблон шаблона). Рассмотрим следующий общий шаблон:

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

Используя этот шаблон, несколько производных классов могут наследовать от DerivationHelper и реализовывать метод clone() с использованием соответствующих конструкторов копирования.

Реализация и преимущества

Это решение предлагает несколько преимуществ:

  • Простота: код краткость и простота реализации.
  • Расширяемость: добавление новых производных классов не требует изменения базового класса.
  • Производительность: вызовы виртуальных функций относительно эффективны.

Используя метод виртуального клонирования() и идиому CRTP, программисты могут эффективно достичь желаемой функциональности без необходимости в запутанных или подверженных ошибкам процедурах. подходы.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3