2015-05-22 4 views
86

Mam 2 klasy:Co znaczy: co oznacza?

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

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

popełniłem błąd i napisał base:foo(); zamiast base::foo();. Kod został skompilowany i uruchomiony, ale segfaulted.

Nie wiem, jak mogę to zrobić w Google i nie wiem co to jest, ale jestem bardzo zainteresowany: co to znaczy?

base:foo(); 

Jeśli to jest ważne:

class base : public QAbstractGraphicsShapeItem 
+31

To jest [etykieta] (http://en.cppreference.com/w/cpp/language/goto). – chris

+19

Jest to przypadek, w którym pomaga włączenie ostrzeżeń, patrz [na żywo] (http://melpon.org/wandbox/permlink/ey2lvaSxYPlkjsXG) ... Ostrzeżenie: etykieta "podstawowa" zdefiniowana, ale nieużywana [-Wunused-label ] '... może powinniśmy dodać tę stronę pytania: * Czy próbowałeś włączyć ostrzeżenia * –

+6

To zakończyło się przepełnieniem stosu. Jak właściwe! –

Odpowiedz

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

odpowiada:

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

Z powodu nieskończonej rekurencji, funkcja powoduje przepełnienie stosu.

+1

tak, znalazłem ten błąd, gdy widziałem wiele wywołań 'foo()' w stosie wywołań. dzięki – railmisaka

+0

czy istnieją ostrzeżenia o tym dostępne w gcc/clang itp.? – nonsensation

+9

@Serthy, Kiedy używam '-Wall', otrzymuję komunikat ostrzegawczy: * socc.cc: 3: 4: warning: etykieta 'base' zdefiniowana, ale nieużywana [-Wunused-label] base: // Nieużywany etykieta. * –