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

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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.