Учитывая базовый класс, который наследуется множеством производных классов и структурой программы, для которой требуется управлять ими с помощью указателей базового класса для каждого объекта. Есть ли простой способ скопировать весь производный объект, когда известен только указатель базового класса?
Оглядываясь, казалось бы, возможно (если бы невероятно утомительно) использовать вызов dynamic_cast
, чтобы проверить, можно ли указать базовый указатель в качестве соответствующего производного класса, а затем скопировать его с помощью конструктора копирования производного класса. Однако это не является оптимальным решением, частично из-за чрезмерного использования dynamic_cast, а также будет наблюдаться полная головная боль для поддержания и расширения.
Еще одно элегантное решение, с которым я столкнулся, выглядит следующим образом:
class Base
{
public:
Base(const Base& other);
virtual Base* getCopy();
...
}
class Derived :public Base
{
Derived(const Derived& other);
virtual Base* getCopy();
...
}
Base* Base::getCopy()
{
return new Base(*this));
}
Base* Derived::getCopy()
{
return static_cast<Base*>(new Derived(*this));
}
Затем, вызывая getCopy()
в указателе Base-класса на любой производный объект, все-таки возвращается указатель базового класса, а также весь экземпляр производного объекта был скопирован. Этот метод намного удобнее обслуживать, поскольку он требует, чтобы аналогичная функция getCopy()
находилась во всех производных классах и устраняла необходимость тестирования всех возможных производных объектов.
По существу, это мудрый? или есть лучший, даже более простой способ сделать это?