Может быть, я что-то упускаю, но разве вам не лучше с виртуальным clone
методом на Vir
?Это означает, что вы можете избежать неприятного приведения в конструкторе копирования ControlPanel
, указанном в вашем собственном ответе.Это то же самое, что @Andrew Aylett предлагает в его ответ с использованием duplicate
вместо clone
.
Что-то вроде
class Vir
{
public:
virtual Vir* clone() const = 0;
...
};
, который реализованв Handler
должно быть
Handler* Handler::clone() const
{
return new Handler( *this );
}
Обратите внимание, что использование ковариантного возвращаемого типа, то есть Handler::clone
может возвращать Handler*
, а не просто Vir*
, и при этом оставаться действительным переопределением Vir::clone
.
Это делает ControlPanel
конструктор копирования просто
ControlPanel( const ControlPanel& c )
: v( c.v->clone() )
{
}