Co znaczy?

92

Mam 2 zajęcia:

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

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

Popełniłem błąd i base:foo();zamiast tego pisałem base::foo();. Kod został skompilowany i uruchomiony, ale posegregował.

Nie wiem, jak mogę to wygooglować i nie wiem, co to jest, ale jestem bardzo zainteresowany: co to oznacza?

base:foo();

Jeśli to ważne:

class base : public QAbstractGraphicsShapeItem
railmisaka
źródło
32
To jest etykieta .
chris
20
Jest to przypadek, w którym pomaga włączenie ostrzeżeń, zobacz je na żywo ... warning: label 'base' defined but not used [-Wunused-label]... być może musimy dodać tę stronę z pytaniami: Czy próbowałeś włączyć ostrzeżenia
Shafik Yaghmour
6
Skończyło się to przepełnieniem stosu. Jak dobrze!
Laurent LA RIZZA

Odpowiedzi:

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

jest równa:

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

Ze względu na nieskończoną rekurencję funkcja powoduje przepełnienie stosu.

R Sahu
źródło
1
tak, znalazłem ten błąd, kiedy zobaczyłem wiele callów foo()na stosie call. dzięki
railmisaka
czy są dostępne ostrzeżenia w gcc / clang itp.?
nonsensation
10
@Serthy, Kiedy używam -Wall, otrzymuję komunikat ostrzegawczy: socc.cc:3:4: ostrzeżenie: etykieta „podstawowa” zdefiniowana, ale nie używana [-Wunused-label] base: // Nieużywana etykieta.
R Sahu
10
@Serthy: IIRC Visual Studio ma ostrzeżenie „rekurencyjne na wszystkich ścieżkach kontrolnych”.
MSalters