Su método f()
sigue anulado. Esta relación es útil cuando se implementa el patrón de diseño Template Method. Básicamente, implementaría conjuntos comunes de operaciones en la clase base. Esas operaciones de clase base invocarían un método virtual, como su f()
. Si la clase derivada anula f()
, las operaciones de la clase base terminan llamando a la versión derivada de f()
. Esto permite que las clases derivadas mantengan el algoritmo base igual, pero modifique el comportamiento para satisfacer sus necesidades. Aquí está un ejemplo trivial:
#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();
}
Aquí está el resultado en tiempo de ejecución:
$ ./a.out
Derived::f()
Base::f()
clases derivadas Tanto llaman la misma operación de clase base, pero el comportamiento es diferente para cada clase derivada.
Ese es otro buen ejemplo. – Omnifarious
De hecho, eso es simplemente viejo un buen ejemplo. Respondí la pregunta incorrecta. Oops. :-) – Omnifarious