friend est absolument à proscrire (comme toujours : sauf (rares) exception) car en effet il casse l'encapsulation.
Dans votre cas : l'encapsulation des Vecteur est cassée pour les Matrice33 : le jour où l'ond décide de changer la représentation interne des Vecteur, on sera obligé de changer le code des Matrice33 ; ce qui est justement ce que les principes d'encapsulation et d'abstration cherchent à éviter !
Avec friend, vous augmenter le couplage entre parties du code ; ce qui est précisément l'inverse des principes de base recherchés par l'OO.
Qu'y a-t-il de plus lourd à écrire z.x() plutôt que z.x (pour l'exemple des Complexe).
Si le code est lourd à écrire, c'est peut être qu'il vous manque de bonne méthodes (publique) ou alors des maths (= des expressions algébriques compactes ; et du coup, peut être aussi les méthodes correspondantes ; par exemple pour faire un produit de matrice on peut utiliser des produits scalaires entre vecteurs lignes et vecteurs colonnes ; si l'on creuse dans ce sens, alors il faudrait certainement offrir une « vue » « vecteur colonne j » sur les Matrice : c.-à-d. une méthode qui retourne, sans copie (c'est ça que j'appelle « vue ») une colonne de la Matrice pour la voir comme un Vecteur ; mais ceci est certainement avancé et nécessiterait trop de code pour que ça vaille la peine ; c'est juste pour illustrer le propos ; dans votre cas concret (Matrice 3 par 3) le plus simple est certainement d'écrire directement les formules (et quel lien avec des vecteurs de dimension quelconque ??) [je ne vous demande pas de répondre à cela ; simplement d'y réfléchir de votre coté ; et j'y vois 2 réponses (correctes) possibles]