class Shape { //.. virtual ~Shape() =0; // declare virtual destructor //.. }; class Rectangle : public Shape { TwoDPoint * points; Rectangle () { points = new TwoDPoint[4]; // allocate memory for points }; ~Rectangle () { delete [] points; } // .. }
Casting und Run-Time-Type ID:
Casting
( = Typumwandlung) sollte möglichst wenig benutzt werden,
ist aber manchmal unvermeidlich.
Im letzten Kurs wurden
C-Style casts gezeigt:
int n = (int) 30.65;
Diese Art von casts sollte in C++ nicht mehr verwendet werden, stattdessen
Aber nicht: double Rectangle, ...
vector<Shape*> vecshape; // vector with base-class pointers // add some concrete shapes vecshape.push_back( new Rectangle()); vecshape.push_back( new Oval()); vecshape.push_back( new Rectangle()); vecshape.push_back( new RoundRect()); vecshape.push_back( new Oval()); vecshape.push_back( new Oval()); // make the shapes all red, move and draw them for ( int i=0; i<vecshape.size(); i++ ){ Rectangle * rp; rp = dynamic_cast<Rectangle *>( vecshape[3] ); if ( rp ) { // cast ok for i=0,2 cout << " Can cast into rectangle" << endl; rp->Draw(); } else { // cast not ok for i=1,3,4,5 cout << " Cannot cast into rectangle" << endl; } }
Damit Typ-Identifizierung zur Laufzeit möglich ( = RTTI ) !
GDuckeck 2019-08-01