2015-05-22 7 views
86

ho 2 classi:Cosa significa: significa?

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

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

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

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

base:foo(); 

Se è importante:

class base : public QAbstractGraphicsShapeItem 
+31

È un [etichetta] (http://en.cppreference.com/w/cpp/language/goto). – chris

+19

Questo è un caso in cui è utile attivare gli avvisi, vedere [live] (http://melpon.org/wandbox/permlink/ey2lvaSxYPlkjsXG) ... 'warning: etichetta 'base' definita ma non utilizzata [-Wunused-label ] '... forse abbiamo bisogno di aggiungere questo fare una domanda a pagina: * Hai provato ad attivare gli avvisi * –

+6

Che si è conclusa con un overflow dello stack. Quanto appropriato! –

risposta

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

è equivalente a:

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

causa ricorsione infinita, la funzione provoca overflow dello stack.

+1

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

+0

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

+9

@Serthy, Quando uso '-Wall', viene visualizzato il messaggio di avviso: * socc.cc: 3: 4: avviso: etichetta 'base' definita ma non utilizzata [-Wunused-label] base: // An unused etichetta. * –