//statcast.cpp
/*************************************************************************
File: statcast.cpp
Description: This file contains an example of a static_cast
Source(s): "More Effective C++", Scott Meyers, Addison-Wesley, 1996.
Course Section: Advanced C++ Basics, Casting
Author: j. stafford
Date: 970119
*************************************************************************/
#include <iostream.h>

class BaseClass {
   virtual void dummy() {} //needed to enable downcasts
};

class Class : public BaseClass {
public:
   operator double() { return 3.3; }
};

class Class1 {
public:
   Class1(int) {};     //does nothing with passed in arg, for example only
};

class Class2 {
public:
   Class2 (int value) : value_(value) {}
   operator Class1() { return Class1(value_); } //creates Class 1
private:
   int value_;
};

void* callback(void* clientData) { return clientData; }

main() {   //static_casts...
   Class object;

      //will convert from one type to another legal type
   int num1=1, num2=3;
   double result1 = ((double)num1)/num2;              //C
   double result2 = static_cast<double>(num1)/num2;   //C++

      //won't convert type to an illegal type
   Class1 *obj1 = (Class1*) &object;             //C-Style allows this cast
//   Class1 *obj2_1 = static_cast<Class1*>(&object); //static_cast won't allow
   Class1 *obj2_2 = static_cast<Class1*>((void*)&object); //can trick it

      //SHOULDN'T change const - works under BORLAND 4.5
   const Class *cptr = &object;
   Class *ptr1 = (Class*)cptr;
//   Class *ptr2 = static_cast<Class*>(cptr);
   Class *ptr2;

      //will downcast from base type to derived type
   BaseClass *bptr = &object;
   ptr1 = (Class*)bptr;
   ptr2 = static_cast<Class*>(bptr);

      //will re-interpret void* addresses to object pointers
   ptr1 = (Class*)callback(&object); //simulates casting returned client data
   ptr2 = static_cast<Class*>(callback(&object));

   return 0;
}
//end of file

