2012-09-27 17 views
5

Tengo una clase Base con una función virtual pura f(). Otra clase Derived deriva de Base. Llamo al f() desde Derived. Y usando g ++, recibo un error del enlazador.¿Por qué no se queja g ++ cuando la clase derivada llama a la función virtual pura de la base?

[[email protected] tmp]$ g++ pure_virtual_function_call.cpp 
/tmp/ccGQLHi4.o: In function `Derived::f()': 
pure_virtual_function_call.cpp:(.text._ZN7Derived1fEv[_ZN7Derived1fEv]+0x14): undefined reference to `VirtualBase::f()' 
collect2: error: ld returned 1 exit status 

Me parece que el error fue capturado por el vinculador. ¿Por qué el compilador no informó este error? ¿Por qué dejarlo al enlazador?

Aquí está el código:

#include <iostream> 

using namespace std; 

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

class Derived : public VirtualBase { 
public: 
    void f(){ 
     VirtualBase::f(); 
     cout << "Derived\n" ; 
    } 
}; 


int main(){ 
    Derived d; 
    d.f(); 
    return 0; 
} 
+2

¿Podría mostrar el código fuente? Eso lo haría mucho más fácil de entender. –

+0

Por favor, muestre su código de ejemplo. Sin eso, será difícil responder. –

Respuesta

12

Porque las funciones virtuales puras pueden tener definiciones y, si lo hacen, puede llamarlas de forma no virtual utilizando la sintaxis VirtualBase::f().

El compilador no tiene manera de saber si tiene la intención de definir la función o no, por lo que el error solo puede ser detectado por el enlazador.

+0

Ejemplo de cuándo un virtual puro puede tener una definición? –

+2

@Agnel Kurian: ¿Qué quieres decir? Cualquier función virtual pura puede tener una definición. –

+1

No sabía que las funciones virtuales puras pueden tener una definición. Gracias. –

8

No es un error llamar a una función virtual pura. Es un error llamar a cualquier función que no tenga una definición. Una función virtual pura puede tener una definición.

+0

Ejemplo de cuándo un virtual puro puede tener una definición? –

+2

@Agnel Kurian en cualquier momento. 'clase C {virtual void f() = 0; }; void C :: f() {} ' –

+1

Debería agregar, que solo no se permite la llamada virtual – Lol4t0

Cuestiones relacionadas