list<Component>
означает, что list
может содержать только объекты, тип которых точно равен Component
. Он не может содержать объекты какого-либо другого типа (даже если он получен из компонента).
Поскольку невозможно создать (завершить) объекты типа Component
, этот список нельзя использовать.
Чтобы создать список, в котором может храниться любой объект, имеющий Component
в качестве базового класса, элементы списка должны храниться по ссылке. Но тогда вам нужно подумать об управлении временем жизни объектов в списке.
Один из способов сделать это будет:
std::list< std::shared_ptr<Component> > components;
и цикл может быть:
for(auto& comp : components) {
return comp->getPrice();
}
(хотя почему вы используете цикл, когда всегда выходите из первого элемента, это другой вопрос).
Также доступны другие опции, которые представляют различную семантику владения. Я бы порекомендовал прочитать руководство по умным указателям в C ++ для дальнейшего понимания этой темы.