stehe aufm schlauch



  • mal angenommen ich habe 2 klassen

    klasse a
    und
    klasse b
    (welche abgeleitet ist von a und hat eine neue function getWert() und ein neues attribut bool wert;)

    kann ich dann sowas machen

    b* zeigeraufObjectderKlasseB =(b*) zeigeraufObjectderKlasseA;

    geht sowas?? also ich habs gemacht und es geht aber wieso ?? es ist doch zuwenig speicher allokiert oder ? wenn ich jetzt b->getWert() mache, kanns doch sein das ein segfault kommt oder ?



  • Wenn b von a abgeleitet ist, so ist doch genügend Speicher allokiert, allerdings
    sollte man für so etwas den dynamic_cast verwenden



  • aber in der msdn steht

    class B { ... };
    class D : public B { ... };
    
    void f()
    {
      B* pb = new D;              // unclear but ok
      B* pb2 = new B;
    
      D* pd = dynamic_cast<D*>(pb);    // ok: pb actually points to a D
      ...
      D* pd2 = dynamic_cast<D*>(pb2);  //error: pb2 points to a B, not a D
                            // pd2 == NULL
      ...
    }
    

    ach ja ich habe noch vergessen zu sagen das bei

    klasse a
    und
    klasse b
    (welche abgeleitet ist von a und hat eine neue function getWert() und ein neues attribut bool wert;)

    kann ich dann sowas machen

    b* zeigeraufObjectderKlasseB =(b*) zeigeraufObjectderKlasseA;

    nicht initalisiert wurde.

    also praktisch

    b* zeigeraufObjectderKlasseB =0;
    a* zeigeraufObjectderKlasseA =new a(3);

    zeigeraufObjectderKlasseB =(b*) zeigeraufObjectderKlasseA;

    danke für die schnelle antwort



  • Was verstehst du denn nicht?

    Überleg mal:
    du hast ein Fahrzeug und du hast ein Auto.

    Nun ist Auto von Fahrzeug abgeleitet.
    Du erstellst ein Fahrzeug.
    Aber ein Fahrzeug ist doch kein Auto (denk an Motorräder)
    Deshalb kannst du nicht so tun als wäre das Fahrzeug ein Auto.

    Du kannst lediglich so tun als wäre ein Auto ein Fahrzeug (was ja durchaus logisch ist).

    Du kannst nun aber auch ein Auto in ein Fahrzeug casten und dann später das Fahrzeug wieder zu einem Auto machen - da es ja ursprünglich ein Auto war.

    deshalb gibt es dynamic_cast



  • wenn ich dynamic_cast benutze bekomme ich immer eine exception.
    Unbehandelte Ausnahme bei 0x77e73887 in testest.exe: Microsoft C++ exception: __non_rtti_object @ 0x0012ed24.

    aber die sache is die, ich programmiere gerade an einem spiel und ich verwende eine gameengine welche mir ein collisionsobjekt liefert.

    b* zeigeraufObjectderKlasseB =0; //abgeleitet von a
    a* zeigeraufObjectderKlasseA =new a(3);

    zeigeraufObjectderKlasseB =(b*) zeigeraufObjectderKlasseA;

    also die collisionsfunktion gibt mir ein objekt von typ a, jedoch brauche ich
    das objekt als b objekt weil ich eine einzige methode zusätzlich brauche.

    zeigeraufObjectderKlasseB =(b*) zeigeraufObjectderKlasseA;

    so funktioniert das schon jedoch habe ich halt angst das beim 10000 mal ein fehler auftaucht.



  • Es liefert dir diesen Fehler, weil der dynamic_cast vermutlich fehltschlägt, mach
    um den cast mal ein try {...} catch (bad_cast &bc) {}

    Edit:
    sehe gerade du benutzt Pointer, dort ist der Zeiger bei nem Fehler 0



  • ich habe gelesen das man bei vc6++ das RTTI erst aktivieren muss, jedoch weiss ich nicht wo man das bei vc7++ findet




Anmelden zum Antworten