2015-12-14 20 views
11

Welche Art von Besetzung findet hier statt (in B::get())?Gegossene abgeleitete Klasse zur Basis

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; 
} 

Ich habe diese Art von Code in einer berühmten API gesehen. Ist es besser, static_cast<A*>(this); zu tun?

+8

Es gibt überhaupt kein Casting, nur eine implizite Konvertierung. Ein Cast ist eine explizite Conversion. – molbdnilo

Antwort

9

Dies ist eine standardmäßige Zeigerkonvertierung von abgeleiteten auf Basis. Die Regeln lauten, dass ein Zeiger auf D mit einigen const/volatile Qualifikationen in einen Zeiger auf B mit den gleichen Qualifikationsmerkmalen konvertiert werden kann, wenn B eine Basisklasse von ist.

Die Standardkonvertierungen sind implizite Konvertierungen mit eingebauten Bedeutungen und sind separate Konzepte zu Dingen wie static_cast oder C-Stil-Umwandlungen.

Im Allgemeinen ist es am besten, wenn Sie können auf implizite Konvertierungen verlassen. Explizite Conversions fügen mehr Code-Rauschen hinzu und können einige Wartungsfehler verbergen.

+0

Streng, "kann in einen Zeiger auf" B "mit dem gleichen * oder mehr * Qualifier" –

+2

umgewandelt werden Ich schlage vor, speziell seine Frage zu beantworten: "Nein, es ist nicht besser,' static_cast 'zu verwenden - in der Tat ist es schlimmere Praxis. Vermeide immer Abgüsse, wenn du sie nicht brauchst. " –

+0

@MartinBonner Stimme nicht zu! Implizite Casts sind die Quelle aller verrückten Bugs. Manchmal wünschte ich, C++ hätte sie überhaupt nicht ... Nichts falsch daran, explizit zu sein. – Barry

3

Es ist implizite Umwandlung in Vorgänger. Implizite Konvertierungen sind im Allgemeinen sicher und sie können nichts tun, was static_cast nicht kann. Sie sind sogar noch eingeschränkter: Sie können einen unkontrollierten Downcast mit static_cast durchführen, aber nicht mit impliziter Konvertierung.

Verwandte Themen