2012-09-27 5 views
5

Ich habe eine Klasse Base mit einer rein virtuellen Funktion f(). Eine andere Klasse Derived stammt von Base. Ich rufe f() von innerhalb Derived. Und mit g ++ bekomme ich einen Fehler vom Linker.Warum klagen g ++ nicht, wenn abgeleitete Klasse reine virtuelle Funktion der Basis aufruft?

[[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 

Es scheint mir, dass der Fehler vom Linker gefangen wurde. Warum hat der Compiler diesen Fehler nicht gemeldet? Warum überlassen Sie es dem Linker? Hier

ist der Code:

#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

Könnten Sie bitte den Quellcode anzeigen? Das würde es viel leichter verständlich machen. –

+0

Bitte zeigen Sie Ihren Beispielcode. Ohne das wird es schwer zu beantworten sein. –

Antwort

12

Da reine virtuelle Funktionen Definitionen haben können, und wenn dies der Fall ist, dürfen Sie sie nicht-virtuell mit der Syntax VirtualBase::f() aufrufen.

Der Compiler hat keine Möglichkeit zu sagen, ob die Funktion definiert werden soll oder nicht, und so kann der Fehler nur vom Linker erkannt werden.

+0

Beispiel für eine reine virtuelle kann eine Definition haben? –

+2

@AgnelKurian: Was meinst du? Jede reine virtuelle Funktion kann eine Definition haben. –

+1

Ich wusste nicht, dass rein virtuelle Funktionen eine Definition haben können. Vielen Dank. –

8

Es ist kein Fehler, eine rein virtuelle Funktion aufzurufen. Es ist ein Fehler, eine Funktion aufzurufen, die keine Definition hat. Eine reine virtuelle Funktion kann eine Definition haben.

+0

Beispiel für eine reine virtuelle kann eine Definition haben? –

+2

@AgnelKurian jederzeit. 'Klasse C {virtuelle Leere f() = 0; }; void C :: f() {} ' –

+1

Sie sollten hinzufügen, dass nur nicht virtueller Anruf erlaubt ist – Lol4t0