2015-05-22 15 views
86

Ich habe 2 Klassen:Was bedeutet: gemein?

class base { 
    virtual void foo() {}; 
}; 

class derived : public base { 
    void foo() { base::foo(); } 
}; 

ich einen Fehler gemacht und schrieb base:foo(); statt base::foo();. Der Code wurde kompiliert und ausgeführt, aber seguefällt.

Ich weiß nicht, wie ich es googlen kann und weiß nicht, was es ist, aber ich bin sehr interessiert: was heißt das?

base:foo(); 

Wenn es wichtig ist:

class base : public QAbstractGraphicsShapeItem 
+31

Es ist ein [Label] (http://en.cppreference.com/w/cpp/language/goto). – chris

+19

Dies ist ein Fall, in dem das Einschalten von Warnungen hilft, siehe [it live] (http://melpon.org/wandbox/permlink/ey2lvaSxYPlkjsXG) ... 'Warnung: Label 'Basis' definiert, aber nicht verwendet [-Wundelabel ] '... vielleicht müssen wir das hinzufügen eine Frage Seite: * Haben Sie versucht, Warnungen zu aktivieren * –

+6

Das endete mit einem Stapelüberlauf. Wie angemessen! –

Antwort

117
void foo() { base:foo(); } 

entspricht:

void foo() 
{ 
    base: // An unused label. 
    foo(); // Calls the function again, resulting in infinite recursion. 
} 

Durch unendliche Rekursion, bewirkt die Funktion Stapelüberlauf.

+1

Ja, ich habe diesen Fehler gefunden, als ich viele Aufrufe von 'foo()' im Call-Stack sah. danke – railmisaka

+0

gibt es warnungen dafür in gcc/clang etc.? – nonsensation

+9

@Serthy, Wenn ich '-Wall' verwende, bekomme ich die Warnmeldung: * soc.cc: 3: 4: Warnung: Label 'base' definiert, aber nicht benutzt [-Wundelabel] base: // Ein unbenutztes label. * –