Большая часть информации, которую вы предоставляете, должна быть узнаваема на следующей диаграмме классов ( plantuml input).Я надеюсь, что это отвечает на первый вопрос.
@startuml
class A
A o--> B
A : + method()
A : + B& getB()
A : - B m_B
A --> "getC" D
class B
B : + method()
B --> "getC" D
class C
C : + method()
class D <<Singleton>>
D --> "0..n" C
D : + C* getC( int index )
D : - list<C> m_containerOfC
@enduml
Относительно второго вопроса: я думаю, что цель рисования диаграмм UML (я полагаю, для проектирования) в основном заключается в абстрагировании, следовательно, игнорируя детали.Нет смысла пытаться выразить полную программу C ++ на UML после того, как вы написали программу.Вы можете купить программы, которые (пытаются) сделать это для вас, но я не думаю, что эти диаграммы полезны.
Ответ на ваш третий вопрос заключается в том, что на этапе проектирования UML для реализации java и c ++ должен быть равен или, по крайней мере, для значительной части.Проектирование - это выбор и подключение шаблонов проектирования и т. Д., И они не зависят от языка.Когда вы начинаете детализировать свои диаграммы, чтобы представить больше деталей реализации (например, тип используемых контейнеров и т. Д.), Тогда вступает в игру выбранный язык для реализации.Однако на этом этапе вы должны спросить себя, дает ли ваша диаграмма достаточную уверенность в вашем дизайне, а затем начать кодировать ее.