2012-09-02 33 views
6

Duplicar posibles:
Private virtual method in C++C++: funciones virtuales privadas, frente a las funciones virtuales puras

Si he entendido bien a partir de este post (Private virtual method in C++), haciendo una función virtual en una clase base hace que las clases derivadas puedan anularlo. Pero parece que las cosas se detienen allí.

Pero si la función virtual de la clase base es pura, obliga a las clases derivadas a implementar la función. Por lo tanto, una función virtual pura (pública) es meramente una interfaz. Puedo ver un beneficio aquí.

Por otro lado, al hacer privada una función de clase base virtual, solo le da a la clase derivada la capacidad de anular la función, pero no veo ningún beneficio de esto. Es como si esa función virtual privada ni siquiera estuviera allí. Obviamente, la clase derivada no sabe acerca de la existencia de esa función virtual en la clase base porque es privada, entonces ¿hay algún beneficio de declarar una función privada de clase base virtual, en términos de herencia o polimorfismo?

Además, ¿hay alguna situación en la que una clase base declare una función 'pura virtual' y 'privada'?

Gracias.

Respuesta

12

Un beneficio es en la aplicación del template method pattern:

class Base { 

public : 
    void doSomething() { 
    doSomething1(); 
    doSomething2(); 
    doSomething3(); 
    } 
private: 
    virtual void doSomething1()=0; 
    virtual void doSomething2()=0; 
    virtual void doSomething3()=0; 
}; 


class Derived : public Base { 
    private: 
    virtual void doSomething1() { ... } 
    virtual void doSomething2() { .... } 
    virtual void doSomething3() { .... } 
} 

Esto permite que las clases derivadas para implementar cada pieza de una cierta lógica, mientras que la clase base determina cómo poner estas piezas juntas. Y dado que las piezas no tienen sentido por sí mismas, están declaradas private y por lo tanto están ocultas del código del cliente.

0

Si el método es virtual, puede ser anulado por clases derivadas, incluso si es privado. De todos modos, debe declararse con protegido.

+2

¿Por qué declararlo protegido si sabes que nunca necesitarás acceder al método base desde las clases derivadas? Puede anular algo sin necesidad de poder llamarlo. –

+0

http://www.parashift.com/c++-faq-lite/private-virtuals.html – Samson

+0

No hay razón por la que * deba * declararse 'protegido'. Si necesita 'protected', úselo. Si no, entonces usa 'private'. – juanchopanza

3

Es para situaciones en las que la base quiere que sus hijos implementen la funcionalidad que la base necesita usar. Imagina un ejemplo tonto: autos.

class Car { 
public: 
    int getTorque(); 
    int getPower(); 

private: 
    virtual const Engine& gimmeEngine() = 0; 
}; 

class Ferrari : public Car { 
private: 
    FerrariEngine myCoolEngine; 
    const Engine& gimmeEngine() { return myCoolEngine; } 
}; 

ahora Coche no necesita saber nada sobre el motor del Ferrari, sólo que implementa alguna de las interfaces Engine que garantiza que Car puede obtener la información sobre su potencia y par motor.

En este ejemplo tonto todo podría simplificarse haciendo getTorque y getPower puros virtuales, pero espero que ilustren la idea. Base necesita usar alguna lógica específica que sabe que todo niño debe tener, por lo que lo consulta a través de un miembro virtual puro privado.

Cuestiones relacionadas