Копирование экземпляров производных классов из указателей полиморфных базовых классов
Для многих эта загадка программирования оказалась неразрешимой. Давайте рассмотрим связанные с этим сложности и найдем эффективное решение.
Рассмотрим следующий сценарий: у вас есть классы Base, Derived1, Derived2 и т. д., где производные классы наследуются от Base. Учитывая указатель на базовый объект, цель состоит в том, чтобы создать динамически выделяемую копию базового производного объекта, избегая таких проблем, как «обратный адрес временного объекта».
Традиционно это решалось с помощью перечня идентификаторов типов или динамических_приведений в условных операторах. Однако мы ищем более элегантное решение.
Метод виртуального клонирования
Ключ заключается во введении метода виртуального клонирования() в базовый класс, реализованного для каждого производного класса. тип. Этот метод возвращает копию объекта. Если Base не является абстрактным, вы можете вызвать его конструктор копирования, но этот подход несет в себе риск нарезки, если он не реализован должным образом в производных классах.
Идиома CRTP для повторного использования кода
Чтобы избежать дублирования кода, можно использовать идиому CRTP (любопытно повторяющийся шаблон шаблона). Рассмотрим следующий общий шаблон:
templateclass DerivationHelper : public Base { public: virtual Base* clone() const { return new Derived(static_cast (*this)); } };
Используя этот шаблон, несколько производных классов могут наследовать от DerivationHelper и реализовывать метод clone() с использованием соответствующих конструкторов копирования.
Реализация и преимущества
Это решение предлагает несколько преимуществ:
Используя метод виртуального клонирования() и идиому CRTP, программисты могут эффективно достичь желаемой функциональности без необходимости в запутанных или подверженных ошибкам процедурах. подходы.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3