2012-09-27 19 views
5

Ho una classe Base con una pura funzione virtuale f(). Un'altra classe Derived deriva da Base. Chiamo f() dall'interno di Derived. E usando g ++, ottengo un errore dal linker.Perché g ++ non si lamenta quando la classe derivata chiama pura funzione virtuale di 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 

Mi sembra che l'errore sia stato rilevato dal linker. Perché il compilatore non ha segnalato questo errore? Perché lasciarlo al linker?

Ecco il codice:

#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

Potresti mostrare il codice sorgente? Ciò renderebbe molto più facile la comprensione. –

+0

Si prega di mostrare il codice di esempio. Senza quello, sarà difficile rispondere. –

risposta

12

Perché le funzioni virtuali pure possono avere definizioni e, in caso affermativo, è possibile chiamarle non virtualmente utilizzando la sintassi VirtualBase::f().

Il compilatore non ha modo di stabilire se si intende o meno la funzione da definire e quindi l'errore può essere rilevato solo dal linker.

+0

Esempio di quando un puro virtuale può avere una definizione? –

+2

@AgnelKurian: cosa intendi? Qualsiasi funzione virtuale pura può avere una definizione. –

+1

Non sapevo che le funzioni virtuali pure possono avere una definizione. Grazie. –

8

Non è un errore di chiamare una funzione virtuale pura. È un errore chiamare qualsiasi funzione che non ha una definizione. Una pura funzione virtuale può avere una definizione.

+0

Esempio di quando un puro virtuale può avere una definizione? –

+2

@AgnelKurian in qualsiasi momento. 'classe C {virtual void f() = 0; }; void C :: f() {} ' –

+1

È necessario aggiungere che solo la chiamata virtuale non è consentita – Lol4t0