2010-03-18 6 views
11

Sollte static_cast (Basiszeiger) Fehler bei der Kompilierung geben?Sollte static_cast <Derived *> (Basiszeiger) Kompilierzeit Fehler geben?

class A 
{ 
public: 
    A() 
    { 

    } 
}; 

class B : public A 
{ 
public: 
    B() 
    { 
    } 
}; 

int main() 
{ 
    A *a=new A(); 
    B * b=static_cast<B*>(a); // Compile Error? 
} 
+0

Verwenden Sie die '010'-Taste oder Einzug um 4 Leerzeichen für Code-Markup. –

+0

@sandeep, gibt es einen beabsichtigten Zweck zu den 'cout <<' Aussagen in diesen Konstruktoren? Soweit ich sehe, sind sie mit der Frage nicht verwandt und würden besser entfernt werden. –

+1

Es sollte beachtet werden, dass, selbst wenn dieses Code-Snippet gut kompiliert wird, es ein ** undefiniertes Verhalten ** hat. Sie versprechen dem Compiler, dass 'a' auf ein B-Objekt verweist und Sie Ihren Compiler belügen. Nasale Dämonen sind auf dem Weg. –

Antwort

11

Sie stellen keine Kompilierung Fehler geben, weil das eingegossene gut sehr gültig sein könnte, und Sie würden es in der Praxis oft zu tun, zum Beispiel:

A* a = new B; 
B* b = static_cast<B*>(a); // OK 

in Ihrem Code so weit Was den Compiler betrifft, machen Sie das Gleiche. Es kann nicht wissen, dass der Cast ungültig ist, also erlaubt er es zur Kompilierzeit. Zur Laufzeit werden Sie einige unangenehme Fehler bekommen, sobald Sie versuchen, eine Funktion von B auf einer Instanz von A zu verwenden.

14

Es kann keinen Fehler bei der Kompilierung geben, weil eine Base-Derived-Beziehung zur Laufzeit existieren kann, abhängig von der Adresse der zu verarbeitenden Zeiger. static_cast ist immer erfolgreich, aber wird undefined-Verhalten erhöhen, wenn Sie nicht auf den richtigen Typ zu werfen. dynamic_cast kann fehlschlagen oder nicht und teilt Ihnen sogar mit, ob Sie versucht haben, den richtigen Typ zu verwenden oder nicht.

meiner Meinung nach also in sollte static_cast nur gesenkten verwendet werden, wenn der Entwurf, dass eine solche Möglichkeit besteht, herstellen kann. Ein gutes Beispiel dafür ist CRTP. So ist es in manchen Situationen logisch, aber versuche es zu vermeiden, da es undefiniertes Verhalten ist.

RTTI ist nicht für static_cast benötigt, die es theoretisch machen könnten schneller, aber ich werde jederzeit handel in einem dynamic_cast gegen das undefinierte Verhalten, dass static_cast verursachen kann!

+0

Was meinen Sie mit "dynamic_cast kann scheitern oder nicht"? Meinst du, dass Unsicherheit darüber besteht, dass dynamic_cast im obigen Beispiel fehlschlägt? Oder meinst du, dass es immer scheitern wird? – ibizaman

+0

@ibizaman: Hier gibt es keine Unbeständigkeit. Tatsächlich wird es Ihnen sagen, wann es fehlgeschlagen ist und wann es nicht fehlgeschlagen ist. Ich denke, wenn Sie den kompletten Satz lesen, sollte es Sinn machen. – Abhay

+0

in der Tat, es war nur um sicher zu sein :) – ibizaman

Verwandte Themen