14 Stimmen

Sollte static_cast<Derived *>(Base pointer) einen Kompilierzeitfehler verursachen?

Sollte static_cast(Base pointer) einen Kompilierzeitfehler verursachen?

class A
{
public:
    A()
    {

    }
};

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

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

18voto

Abhay Punkte 6851

Es kann keinen Kompilierzeitfehler geben, weil ein Von der Basis abgeleitete Beziehung kann zur Laufzeit abhängig von der Adresse der Zeiger, die gecastet werden, existieren. static_cast ist immer erfolgreich, führt aber dazu, dass undefiniertes Verhalten wenn Sie nicht auf den richtigen Typ zaubern. dynamic_cast kann scheitern oder nicht und sagt Ihnen, ob Sie versucht haben, auf den richtigen Typ zu werfen oder nicht.

Also meiner Meinung nach, static_cast sollte verwendet werden, um nach unten gerichtet nur, wenn das Geschmacksmuster nachweisen kann, dass eine solche Möglichkeit besteht. Ein gutes Beispiel hierfür ist CRTP . In manchen Situationen ist es logisch, aber man sollte es vermeiden, da es ein undefiniertes Verhalten ist.

RTTI ist nicht erforderlich für static_cast was es möglich macht Theoretisch schneller , aber ich werde jederzeit eine dynamic_cast gegen das undefinierte Verhalten, das static_cast verursachen kann!

14voto

Peter Alexander Punkte 51742

Es gibt keinen Kompilierzeitfehler, weil der Cast sehr wohl gültig sein könnte, und man würde es in der Praxis oft tun, z. B.:

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

In Ihrem Code tun Sie, soweit es den Compiler betrifft, dasselbe. Er kann nicht wissen, dass der Cast ungültig wäre, also lässt er ihn zur Kompilierzeit zu. Zur Laufzeit jedoch werden Sie einige unangenehme Fehler erhalten, sobald Sie versuchen, eine Funktion von B auf eine Instanz von A .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X