//dyncast1.cpp
/*************************************************************************
File: dyncast1.cpp
Description: This file contains an example of a dynamic_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 NVBaseClass {};  //a base class with no virtual functions
class Class1 : public NVBaseClass {
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() {   //dynamic_casts...
   Class object, *ptr1, *ptr2;

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

      //will try at run-time to convert type to an illegal type
   Class1 *obj1 = (Class1*) &object;             //C-Style allows this cast
   //Class1 *obj2_1 = dynamic_cast<Class1*>(&object);
   ptr1 = &object;
   Class1 *obj2_1 = dynamic_cast<Class1*>(ptr1);

      //won't downcast from base type to derived type without virtual fn
   Class1 objA(0);
   NVBaseClass *bptrA = &objA;
   Class1 *ptrA1 = (Class1*)bptrA;
//   Class1 *ptrA2 = dynamic_cast<Class1*>(bptrA);      //error

      //won't convert from one type to another legal type
   int num1=1, num2=3;
   double result1 = ((double)num1)/num2;             //works
//   double result2 = dynamic_cast<double>(num1)/num2;   //error

      //won't change const
   const Class *cptr = &object;
   ptr1 = (Class*)cptr;
//   ptr2 = dynamic_cast<Class*>(cptr);

      //won't re-interpret void* addresses to object pointers
   ptr1 = (Class*)callback(&object); //simulates casting client data
//   ptr2 = dynamic_cast<Class*>(callback(&object)); //error

   return 0;
}
//end of file

