Как избавится от дублирования кода?
Я бы создал класс AbstractClass, чтобы CommonClass и ConcreteClass1 наследовались от него. ConcreteClass2 должен наследоваться от ConcreteClass1. В AbstractClass вынес бы из CommonClass те члены, которые должны быть общими для всех классов. Всё.
Можно просто переопределить методы foo и bar в ConcreteClass2