¿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

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.


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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.