Типом результата
Test::clone
является
std::shared_ptr<Test>
.
Строчка
Test1 asd = v[1]->clone();
эквивалентна строчке
Test1 asd = std::shared_ptr<Test>{ ... };
.
Оператора или конструктора преобразования из
std::shared_ptr<Test>
у типа
Test1
нет. Трансляцию строчка
Test1 asd = v[1]->clone();
не пройдет.
Идиома
Cloneable служит для того, чтобы позволить копирование действительных объектов не выходя за рамки общего интерфейса и не зная действительного типа клонируемого объекта.
Или ты неправильно понял идиому, или пробуешь неправильно ее использовать.
Когда ты заранее знаешь тип, тебе незачем пользоваться клонированием, потому что ты можешь просто скопировать стандартным способом.
Правильно твоя строчка должна выглядеть так:
std::shared_ptr<Test> asd = v[1]->clone();
.
Или так:
Test1 asd{ *std::static_pointer_cast<Test1>( v[1] ) };
.