¿Que significa?

92

Tengo 2 clases:

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

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

Cometí un error y escribí en base:foo();lugar de base::foo();. El código fue compilado y ejecutado, pero segmentado.

No sé cómo puedo buscarlo en Google y no sé qué es, pero estoy muy interesado: ¿qué significa eso?

base:foo();

Si es importante:

class base : public QAbstractGraphicsShapeItem
Railmisaka
fuente
32
Es una etiqueta .
chris
20
Este es un caso en el que activar las advertencias ayuda, verlo en vivo ... warning: label 'base' defined but not used [-Wunused-label]... tal vez debamos agregar esta página para hacer una pregunta: ¿Ha intentado activar las advertencias
Shafik Yaghmour
6
Eso terminó con un desbordamiento de pila. ¡Qué apropiado!
Laurent LA RIZZA

Respuestas:

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

es equivalente a:

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

Debido a la recursividad infinita, la función provoca un desbordamiento de pila.

R Sahu
fuente
1
sí, encontré ese error cuando vi muchas llamadas foo()en la pila de llamadas. gracias
railmisaka
¿Hay advertencias para esto disponibles en gcc / clang, etc.?
tontería
10
@Serthy, cuando uso -Wall, aparece el
R Sahu
10
@Serthy: IIRC Visual Studio tiene la advertencia "recursiva en todas las rutas de control" para esto.
MSalters