Это действительно абстрактная проблема, и трудно дать вам хорошее конкретное решение без дополнительных подробностей.
Основным способом решения этой проблемы является наследование.Но это требует предварительного планирования.Это означает, что когда вы ссылаетесь на Foo в проекте A, вы должны использовать указатели или ссылки.Если вы создаете Foo (и вам нужен код из проекта A, создайте Foo_Extended, когда он является частью проекта B), вам потребуется настраиваемая фабрика Foo, которая будет создавать объекты соответствующего типа в зависимости от контекста.
Другойспособ обработки это шаблоны.У вас никогда нет кода в проекте A, ссылающегося непосредственно на глобальный класс Foo.Вместо этого он всегда ссылается на параметр шаблона.В проекте A этот параметр шаблона в конечном итоге будет преобразован в Foo, а в проекте B он будет преобразован в некоторый другой класс, обладающий необходимой функциональностью.
Это два основных способа решения этой проблемы в C ++.И то, что вы используете, во многом зависит от деталей контекста, в котором вы их используете.