2015-12-14 19 views
11

Che tipo di cast si svolge qui (in)?Derivato dalla classe derivata alla base

class A { 
public: 
    A() : a(0) {} 
    int a; 
}; 

class B : public A { 
public: 
    A* get() { 
     return this; //is this C-style cast? 
    } 
}; 

int main() 
{ 
    B b; 
    cout << b.get()->a << "\n"; 

    system("pause"); 
    return 0; 
} 

Ho visto questo tipo di codice in un famoso API. È meglio fare static_cast<A*>(this);?

+8

Non c'è assolutamente nessuna trasmissione, solo una conversione implicita. Un cast è una conversione esplicita. – molbdnilo

risposta

9

Questa è una conversione del puntatore da un derivato standard. Le regole sono che un puntatore a D con alcune qualifiche const/volatile può essere convertito in un puntatore a B con le stesse qualificazioni se B è una classe base di D.

Le conversioni standard sono conversioni implicite con significati incorporati e sono concetti separati per cose come static_cast o cast di tipo C.

In genere è meglio fare affidamento su conversioni implicite quando è possibile. Le conversioni esplicite aggiungono più rumore al codice e possono nascondere alcuni errori di manutenzione.

+0

Strettamente, "può essere convertito in un puntatore a' B' con lo stesso * o più * qualificatori " –

+2

Suggerisco specificamente di rispondere alla sua domanda:" No, non è una pratica migliore usare 'static_cast' - infatti, è pratica peggiore, evita sempre i calchi se non ne hai bisogno ". –

+0

@MartinBonner Non sono d'accordo! I cast impliciti sono la fonte di tutti i tipi di bug stravaganti. A volte vorrei che il C++ non li avesse nemmeno ... Niente di sbagliato nell'essere espliciti. – Barry

3

È una conversione implicita all'antenato. Le conversioni implicite sono generalmente sicure e non possono fare roba static_cast impossibile. In realtà sono ancora più limitati: puoi eseguire un downcast non controllato con static_cast, ma non con la conversione implicita.

Problemi correlati