Cosa significa?


92

Ho 2 classi:

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

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

Ho fatto un errore e ho scritto base:foo();invece di base::foo();. Il codice è stato compilato ed eseguito, ma segfault.

Non so come posso cercarlo su Google e non so cosa sia, ma sono molto interessato: cosa significa?

base:foo();

Se è importante:

class base : public QAbstractGraphicsShapeItem

32

20
Questo è un caso in cui l'attivazione degli avvisi aiuta, vederlo dal vivo ... warning: label 'base' defined but not used [-Wunused-label]... forse dobbiamo aggiungere questa pagina per fare una domanda: Hai provato ad attivare gli avvisi
Shafik Yaghmour

6
Ciò si è concluso con un overflow dello stack. Com'è appropriato!
Laurent LA RIZZA

Risposte:


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

è equivalente a:

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

A causa della ricorsione infinita, la funzione causa un overflow dello stack.


1
sì, ho trovato quell'errore quando ho visto molte chiamate foo()nello stack di chiamate. grazie
railmisaka

ci sono avvisi per questo disponibili in gcc / clang ecc.?
senso

10
@Serthy, quando lo uso -Wall, ricevo il messaggio di avviso: socc.cc:3:4: warning: label "base" definita ma non utilizzata [-Wunused-label] base: // Un'etichetta non utilizzata.
R Sahu

10
@Serthy: IIRC Visual Studio ha l'avviso "ricorsivo su tutti i percorsi di controllo" per questo.
MSalters
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.