next up previous contents index
Next: Modelliere ``hatein'' durch Elemente Up: 50 Ways to Improve Previous: Geerbte Default-Parameterwerte nie ändern

Vermeide ``downcasts''

   

  Explizite Typumwandlung von Basisklassen nach abgeleiteten Klassen heißen Downcasts. Sie sind erlaubt, aber gefährlich:

    class mensch
    { char *name;
    public:
      mensch();
      mensch(char *n);
      char *getname();
    };
    
    class student : public mensch
    { char *ort;
    public:
      student();
      student(char* n, char *o);
      char *getort();
    };
    
    int main()
    { student s("Meier","Paderborn");
      mensch* mp = &s;
      // Ein Downcast:
      cout << ((student*)mp)->getort();
    }

Kommt nun eine zweite abgeleitete Klasse hinzu, kann es gefährlich werden:

    class wirt : public mensch
    {  int umsatz;
       char *ort;
    public:
      wirt();
      wirt(char* n, char *o);
      char *getort();
    };
    
    int main()
    { wirt w("Meier","Paderborn");
      mensch* mp = &w;
      cout << ((student*)mp)->getort();
    }

liefert:

    Segmentation fault (core dumped)

Eine Möglichkeit Downcasts sicherer zu machen:

     class wirt;     // forward
     class student;  // forward
     class mensch
     { ....
       virtual student* cast2student() 
       { return 0;}
       virtual wirt* cast2wirt() 
       { return 0;}
     };
     class student : public mensch
     { ....
       student* cast2student()
       { return this;}
     };
     class wirt : public mensch
     { ....
       wirt* cast2wirt()
       { return this;}
     };
     int main()
     { wirt w("Meier","Paderborn");
       mensch* mp = &w;
       if (mp->cast2student())
         cout << mp->cast2student()->getort();
       else 
         cout << mp->cast2wirt()->getort();
     }


next up previous contents index
Next: Modelliere ``hatein'' durch Elemente Up: 50 Ways to Improve Previous: Geerbte Default-Parameterwerte nie ändern

Peter Pfahler, 1997