Que signifie?

92

J'ai 2 cours:

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

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

J'ai fait une erreur et j'ai écrit à la base:foo();place base::foo();. Le code a été compilé et exécuté, mais par défaut.

Je ne sais pas comment je peux le rechercher sur Google et je ne sais pas ce que c'est, mais je suis très intéressé: qu'est-ce que cela signifie?

base:foo();

Si c'est important:

class base : public QAbstractGraphicsShapeItem
railmisaka
la source
32
C'est une étiquette .
chris
20
C'est un cas où l'activation des avertissements aide, le voir en direct ... warning: label 'base' defined but not used [-Wunused-label]... peut-être devons-nous ajouter cette page de poser une question: Avez-vous essayé d'activer les avertissements
Shafik Yaghmour
6
Cela s'est terminé par un débordement de pile. Comme c'est approprié!
Laurent LA RIZZA

Réponses:

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

est équivalent à:

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

En raison de la récursivité infinie, la fonction provoque un débordement de pile.

R Sahu
la source
1
oui, j'ai trouvé cette erreur quand j'ai vu de nombreux appels foo()dans la pile d'appels. merci
railmisaka
y a-t-il des avertissements à ce sujet dans gcc / clang etc.?
compensation
10
@Serthy, Quand j'utilise -Wall, j'obtiens le message d'avertissement: socc.cc:3:4: warning: label 'base' défini mais non utilisé [-Wunused-label] base: // Un label inutilisé.
R Sahu
10
@Serthy: IIRC Visual Studio a l'avertissement "récursif sur tous les chemins de contrôle" pour cela.
MSalters