Ursachen der Ineffizienz:

Daraus ergibt sich ganz schnell folgender

Wunsch:

Nun kann aber eine Elementfunktion nicht gleichzeitig Elementfunktion zweier Klassen sein. Man benötigt vielmehr ein Sprachkonstrukt, das einer Funktion den Zugriff auf die privaten Elemente einer Klasse erlaubt, ohne daß eine Mitgliedschaft in dieser Klasse Voraussetzung ist.
Dies ist zwar im Grunde genommen nicht mit dem objektorientierten Ansatz in Einklang zu bringen, wird aber dennoch von C++ zur Verfügung gestellt: die friend-Funktion (gekennzeichnet durch das Schlüsselwort friend). Hier wurde die strikte Objektorientiertheit zugunsten der Effizienz verwässert.
Die friend-Funktion besitzt die oben geforderten Eigenschaften und darf daher auch auf die privaten Elemente der Klasse, dessen Freund sie ist, direkt zugreifen (frei nach dem Motto: "Vor Freunden hat man keine Geheimnisse.").