C++/Development/Dynamic Cast
Demonstrate dynamic_cast: base and derived class
#include <iostream>
using namespace std;
class Base {
public:
virtual void f() {
cout << "Inside Base\n";
}
};
class Derived : public Base {
public:
void f() {
cout << "Inside Derived\n";
}
};
int main()
{
Base *bp, baseObject;
Derived *dp, d_ob;
dp = dynamic_cast<Derived *> (&d_ob);
if(dp) {
cout << "Cast from Derived * to Derived * OK.\n";
dp->f();
} else
cout << "Error\n";
cout << endl;
bp = dynamic_cast<Base *> (&d_ob);
if(bp) {
cout << "Cast from Derived * to Base * OK.\n";
bp->f();
} else
cout << "Error\n";
cout << endl;
bp = dynamic_cast<Base *> (&baseObject);
if(bp) {
cout << "Cast from Base * to Base * OK.\n";
bp->f();
} else
cout << "Error\n";
cout << endl;
bp = &d_ob; // bp points to Derived object
dp = dynamic_cast<Derived *> (bp);
if(dp) {
cout << "Casting bp to a Derived * OK\n" <<
"because bp is really pointing\n" <<
"to a Derived object.\n";
dp->f();
} else
cout << "Error\n";
cout << endl;
bp = &baseObject; // bp points to Base object
dp = dynamic_cast<Derived *> (bp);
if(dp){
cout << "Error";
}else {
cout << "Now casting bp to a Derived *\n" <<
"is not OK because bp is really \n" <<
"pointing to a Base object.\n";
}
cout << endl;
dp = &d_ob; // dp points to Derived object
bp = dynamic_cast<Base *> (dp);
if(bp) {
cout << "Casting dp to a Base * is OK.\n";
bp->f();
} else{
cout << "Error\n";
}
return 0;
}
Use dynamic_cast to replace typeid.
#include <iostream>
#include <typeinfo>
using namespace std;
class Base {
public:
virtual void f() {}
};
class Derived : public Base {
public:
void derivedOnly() {
cout << "Is a Derived Object.\n";
}
};
int main()
{
Base *bp, baseObject;
Derived *dp, d_ob;
//////////////////////////////////////////////////////// use typeid
bp = &baseObject;
if(typeid(*bp) == typeid(Derived)) {
dp = (Derived *) bp;
dp->derivedOnly();
}
else
cout << "Cast from Base to Derived failed.\n";
bp = &d_ob;
if(typeid(*bp) == typeid(Derived)) {
dp = (Derived *) bp;
dp->derivedOnly();
}
else
cout << "Error, cast should work!\n";
/////////////////////////////////////////////////////// use dynamic_cast
bp = &baseObject;
dp = dynamic_cast<Derived *> (bp);
if(dp)
dp->derivedOnly();
else
cout << "Cast from Base to Derived failed.\n";
bp = &d_ob;
dp = dynamic_cast<Derived *> (bp);
if(dp) {
dp->derivedOnly();
}else
cout << "Error, cast should work!\n";
return 0;
}