2010-03-28 19 views
11

Per quanto riguarda il seguente programma C++:Conversione del puntatore-puntatore tra classi derivate e di base?

class Base { }; 

class Child : public Base { }; 

int main() 
{ 
    // Normal: using child as base is allowed 
    Child *c = new Child(); 
    Base *b = c; 

    // Double pointers: apparently can't use Child** as Base** 
    Child **cc = &c; 
    Base **bb = cc; 

    return 0; 
} 

GCC produce il seguente errore sull'ultima istruzione di assegnazione:

error: invalid conversion from ‘Child**’ to ‘Base**’ 

la mia domanda è in due parti:

  1. Perché non c'è conversione implicita da Child ** a Base **?
  2. Posso fare in modo che questo esempio funzioni con un cast in stile C o con reinterpret_cast. Usare questi calchi significa buttare via ogni tipo di sicurezza. C'è qualcosa che posso aggiungere alle definizioni di classe per far sì che questi puntatori vengano lanciati implicitamente, o per lo meno formulare la conversione in un modo che mi permetta di usare invece static_cast?
+0

Variazioni su questa domanda in molti linguaggi di programmazione è una delle domande più comuni su SO. Ma tutti lo descrivono in modo leggermente diverso anche per la stessa lingua, quindi trovare i duplicati può essere difficile. –

+0

"Correggere" questo esempio per evitare dominazioni ombreggiate dipenderà dal motivo per cui si sta utilizzando un puntatore al puntatore in primo luogo. – aschepler

risposta

19

Se questo è stato permesso, si potrebbe scrivere questo:

*bb = new Base; 

E c finirebbe punta a un'istanza di Base. Cattivo.

+0

Piccola correzione - poteva dire '** bb = nuova Base();' Solo '* bb' non sarebbe permesso. – Phil

+4

@Phil: 'new' restituisce un puntatore, che è di tipo' * Base'. 'bb' è di tipo' ** Base'. Quindi '* bb' è il giusto livello di dereferenziazione. – Amber

+1

Il razionale è essenzialmente lo stesso delle domande frequenti su comp.lan.gc sulla non equivalenza di 'char **' e 'char const **': http://c-faq.com/ansi/constmismatch.html –

Problemi correlati