Ihre Methode f()
wird immer noch überschrieben. Diese Beziehung ist nützlich, wenn das Entwurfsmuster Template Method implementiert wird. Im Grunde genommen würden Sie in der Basisklasse gemeinsame Operationen implementieren. Diese Basisklassenoperationen würden dann eine virtuelle Methode wie Ihre f()
aufrufen. Wenn die abgeleitete Klasse f()
überschreibt, rufen die Basisklassenoperationen die abgeleitete Version von f()
auf. Dadurch können abgeleitete Klassen den Basisalgorithmus beibehalten, aber das Verhalten an ihre Bedürfnisse anpassen. Hier ist ein einfaches Beispiel:
#include <iostream>
using namespace std;
class Base
{
public:
virtual void f() { cout<<"Base::f()" << endl; }
protected:
void base_foo() { f(); }
};
class DerivedOne: private Base
{
public:
void f() { cout << "Derived::f()" << endl;}
void foo() { base_foo(); }
};
class DerivedTwo: private Base
{
public:
void foo() { base_foo(); }
};
int main()
{
DerivedOne d1;
d1.foo();
DerivedTwo d2;
d2.foo();
}
Hier ist das Ergebnis zur Laufzeit:
$ ./a.out
Derived::f()
Base::f()
Beide abgeleiteten Klassen nennen die gleiche Basisklasse Betrieb aber das Verhalten ist für jede abgeleitete Klasse.
Das ist ein anderes gutes Beispiel. – Omnifarious
In der Tat, das ist einfach nur alt, ein gutes Beispiel. Ich habe die falsche Frage beantwortet. Hoppla. :-) – Omnifarious