Чтобы решить конкретную проблему, вам нужно объявить деструктор для ElectricGuitarComponentFactory
, потому что вы объявили деструктор базового класса как чисто виртуальную функцию. Почему вы объявили деструктор базового класса чисто виртуальным, я не знаю; это действительно не имеет никакого смысла делать это. Деструктор должен быть объявлен виртуальным, но не чисто виртуальным.
Кроме того, синтаксис, который вы использовали,
public: virtual ~GuitarComponentFactory() = 0 {}
плохо сформирован. Вы не можете объявить чисто виртуальную функцию и предоставить определение для нее в определении класса. Если вы хотите предоставить определение для чисто виртуальной функции, вы должны сделать это вне определения класса. Компилятор, который вы используете, Visual C ++, немного мягок в отношении этого правила.