#include <iostream>
class Animal
{
public :
virtual ~Animal( ) { }
} ;
class Dog : public Animal
{
public :
virtual void woof( ) { }
} ;
class Cat : public Animal
{
public :
virtual void meow( ) { }
} ;
int main( )
{
Cat felix;
Cat* the_cat = & felix;
// "normal" cast, which disallows casting between unrelated class hierarchies,
// but while downcasting assumes the programmer knows
Dog* the_dog_1 = static_cast < Dog* > ( the_cat) ;
// your cast with testing validity at runtime
// (doesn't fail at compile time, because there may be a CatDog
// derived from Cat and Dog in other translation unit)
Dog* the_dog_2 = dynamic_cast < Dog* > ( the_cat) ;
// "everything goes" byte reinterpretation cast
Dog* the_dog_3 = reinterpret_cast < Dog* > ( the_cat) ;
the_dog_1- > woof( ) ;
if ( the_dog_2)
the_dog_2- > woof( ) ;
the_dog_3- > woof( ) ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgQW5pbWFsCnsKcHVibGljOgoJdmlydHVhbCB+QW5pbWFsKCl7fQp9OwoKY2xhc3MgRG9nIDogcHVibGljIEFuaW1hbAp7CnB1YmxpYzoKCXZpcnR1YWwgdm9pZCB3b29mKCkgeyB9Cn07CgpjbGFzcyBDYXQgOiBwdWJsaWMgQW5pbWFsCnsKcHVibGljOgoJdmlydHVhbCB2b2lkIG1lb3coKSB7IH0KfTsKCmludCBtYWluKCkKewoJQ2F0IGZlbGl4OwoJQ2F0KiB0aGVfY2F0ID0gJmZlbGl4OwoJLy8gIm5vcm1hbCIgY2FzdCwgd2hpY2ggZGlzYWxsb3dzIGNhc3RpbmcgYmV0d2VlbiB1bnJlbGF0ZWQgY2xhc3MgaGllcmFyY2hpZXMsCgkvLyBidXQgd2hpbGUgZG93bmNhc3RpbmcgYXNzdW1lcyB0aGUgcHJvZ3JhbW1lciBrbm93cyAKCURvZyogdGhlX2RvZ18xID0gc3RhdGljX2Nhc3Q8RG9nKj4odGhlX2NhdCk7CgkvLyB5b3VyIGNhc3Qgd2l0aCB0ZXN0aW5nIHZhbGlkaXR5IGF0IHJ1bnRpbWUKCS8vIChkb2Vzbid0IGZhaWwgYXQgY29tcGlsZSB0aW1lLCBiZWNhdXNlIHRoZXJlIG1heSBiZSBhIENhdERvZwoJLy8gZGVyaXZlZCBmcm9tIENhdCBhbmQgRG9nIGluIG90aGVyIHRyYW5zbGF0aW9uIHVuaXQpCglEb2cqIHRoZV9kb2dfMiA9IGR5bmFtaWNfY2FzdDxEb2cqPih0aGVfY2F0KTsKCS8vICJldmVyeXRoaW5nIGdvZXMiIGJ5dGUgcmVpbnRlcnByZXRhdGlvbiBjYXN0CglEb2cqIHRoZV9kb2dfMyA9IHJlaW50ZXJwcmV0X2Nhc3Q8RG9nKj4odGhlX2NhdCk7CgkKCXRoZV9kb2dfMS0+d29vZigpOwoJCglpZih0aGVfZG9nXzIpCgkJdGhlX2RvZ18yLT53b29mKCk7CgkJCgl0aGVfZG9nXzMtPndvb2YoKTsKfQ==