C++-Programmierung/ Objektorientierte Programmierung/ Virtuelle Freunde


Virtuelle Freunde werden in C++ u.A. dazu verwendet, den Aufruf zu vereinfachen. Dadurch versucht man, den Code lesbarer zu machen. Hier ein Beispiel:

Basis.h
#pragma once

#include <iostream>

class Basis {
public:
	friend void f(Basis& b)
	 { std::cout << "Basis::ruf_f_auf()..." << std::endl; };

protected:
	virtual void ruf_f_auf();
};

inline void f(Basis& b) {
	b.ruf_f_auf();
}
Ableitung.h
#pragma once

#include "Basis.h"

class Ableitung : public Basis {
protected:
	virtual void ruf_f_auf()
	 { std::cout << "Ableitung::ruf_f_auf()..." << std::endl; };  // "Überschreibt" Methode f(Basis& b)
};
main.cpp
#include "Ableitung.h"

void userCode(Basis& b) {
	f(b);
}

int main() {
	Ableitung b;

	std::cout << "Rufe userCode auf..." << std::endl;
	userCode(b);
}
Ausgabe:
Rufe userCode auf...
Ableitung::ruf_f_auf()...

Wie man sieht, wurde die Methode der Basisklasse mit der ruf_f_auf()-Methode der Klasse Ableitung überschrieben.

Der Nachteil von befreundeten Methoden ist nicht nur, dass die Datenkapselung umgangen wird, sondern auch, dass für die dynamische Bindung eine zusätzliche Zeile hinzugefügt werden muss. Um den Effekt eines virtuellen Freunds zu bekommen, sollte die virtuelle Methode versteckt sein (in der Regel protected). Dies wird auch im Englischen virtual friend function idiom genannt.[1]

Bitte beachten Sie im Beispiel oben, dass die Klasse Ableitung das Verhalten von der Methode protected virtual ruf_f_auf() überschriebt, ohne seine eigene Variante für die befreundete Methode f(Base &) zu haben.

Referenzen Bearbeiten

  1. 14.3: What are some (dis)advantages of using friend functions?