C++/Development/Dynamic Cast

Материал из C\C++ эксперт
Перейти к: навигация, поиск

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;
}