#include struct car { int val; car() : val(0) {} car(int x) : val(x) {} virtual operator int() { return val+1; } virtual ~car() {} }; struct Toyota : public car { int val; Toyota() : val(0) {} Toyota(int x) : val(x) {} operator int() { return val+2; } }; struct Honda : public car { int val; Honda() : val(0) {} Honda(int x) : val(x) {} }; int main(int argc, char** argv) { car* car_array[3]; car_array[0] = new car; car_array[1] = new Toyota; car_array[2] = new Honda; for (int i = 0; i < 3 ; ++i) { // call a conversion function from object to int // the base class has a virtual conversion function so the // type actual conversion function to be called is determined at runtime int x = *car_array[i]; delete car_array[i]; std::cout << x << std::endl; } return 0; }