class Object { // generic object
public:
virtual ~Object() { } // virtual destructor
int intValue() const throw(BadCastException); // get integer value
string stringValue() const throw(BadCastException); // get string value
};
class Integer : public Object { // integer object
private:
int value; // integer value
public:
Integer(int v = 0) { value = v; } // constructor
int getValue() const { return value; } // get the value
};
class String : public Object { // string object
private:
string value; // string value
public:
String(const string& v = "") { value = v; } // constructor
string getValue() const { return value; } // get the value
};
// get Integer's value
int Object::intValue() const throw(BadCastException)
{
const Integer* p = dynamic_cast<const Integer*>(this);
if (p == NULL) throw BadCastException("intValue() from non-Integer");
return p->getValue();
}
// get String's value
string Object::stringValue() const throw(BadCastException)
{
const String* p = dynamic_cast<const String*>(this);
if (p == NULL) throw BadCastException("stringValue() from non-String");
return p->getValue();
}