Función virtual pura con implementación.

Resuelto skydoor asked hace 14 años • 10 respuestas

Mi comprensión básica es que no existe una implementación para una función virtual pura; sin embargo, me dijeron que podría haber una implementación para una función virtual pura.

class A {
public:
    virtual void f() = 0;
};

void A::f() {
    cout<<"Test"<<endl;
}

¿Está bien el código anterior?

¿Cuál es el propósito de convertirla en una función virtual pura con una implementación?

skydoor avatar Jan 19 '10 03:01 skydoor
Aceptado

Una función pura virtualdebe implementarse en un tipo derivado del que se creará una instancia directa; sin embargo, el tipo base aún puede definir una implementación. Una clase derivada puede llamar explícitamente a la implementación de la clase base (si los permisos de acceso lo permiten) usando un nombre de alcance completo (llamando A::f()en su ejemplo, si A::f()fueran publico protected). Algo como:

class B : public A {

    virtual void f() {
        // class B doesn't have anything special to do for f()
        //  so we'll call A's

        // note that A's declaration of f() would have to be public 
        //  or protected to avoid a compile time problem

        A::f();
    }

};

El caso de uso que se me ocurre es cuando hay un comportamiento predeterminado más o menos razonable, pero el diseñador de clases quiere que ese tipo de comportamiento predeterminado se invoque solo explícitamente. También puede darse el caso de que desee que las clases derivadas siempre realicen su propio trabajo pero que también puedan llamar a un conjunto común de funcionalidades.

Tenga en cuenta que, aunque el lenguaje lo permite, no es algo que veo que se usa comúnmente (y el hecho de que se pueda hacer parece sorprender a la mayoría de los programadores de C++, incluso a los experimentados).

Michael Burr avatar Jan 18 '2010 21:01 Michael Burr

Para ser claros, no estás entendiendo qué = 0; después de una función virtual significa.

= 0 significa que las clases derivadas deben proporcionar una implementación, no que la clase base no pueda proporcionar una implementación.

En la práctica, cuando marca una función virtual como pura (=0), tiene muy poco sentido proporcionar una definición, porque nunca será llamada a menos que alguien lo haga explícitamente a través de Base::Function(...) o si el El constructor de la clase base llama a la función virtual en cuestión.

Terry Mahaffey avatar Jan 18 '2010 21:01 Terry Mahaffey