#include <iostream>
#include <cstdint>

class A {
	public:
		virtual ~A () {}
};

class B : public A {
};

class C : public A {
};

int main() {
	uint8_t x;
	int32_t y = -4321238;
	int* z;
	B b;
	A& a = b;
	
	try {
		std::cout << "Casting Integers" << std::endl;
		x = static_cast<uint8_t> (y);
		std::cout << x << std::endl;
		
		std::cout << "Reinterpret casting pointers" << std::endl;
		z = reinterpret_cast<int*> (y);
		
		C* pc = dynamic_cast<C*> (&a);
		std::cout << pc << std::endl;
		
		std::cout << "Reinterpret casting references" << std::endl;
		C& rc = dynamic_cast<C&> (a);
		std::cout << &rc << std::endl;
	} catch (...) {
		std::cout << "Exception!\n";
	}
	
	return 0;
}