dynamic_cast example

// File: dynamic_cast.cpp


#include <iostream>
using namespace std;

class pet
{
virtual void funk() {}
};

class dog: public pet
{
public:
void non_virtual_dog_funk() {
   cout << "Executing non_virtual_dog_funk()" << endl;
}
};

class cat: public pet
{
public:
   void non_virtual_cat_funk() {
   cout << "Executing non_virtual_cat_funk()" << endl;
}
};

int main()
{
   pet* pp;
   dog* pd;
   cat* pc;
   pet p;
   dog D;
   cat C;

   pp = &D;
   // pd = pp;
   pd = dynamic_cast<dog*>(pp);
   if (!pd) {
      cerr << "pd = dynamic_cast<dog*>(pp) failed the first time\n";
      pd->non_virtual_dog_funk();
   }  
   else {
      pd ->non_virtual_dog_funk();
      // pp->non_virtual_dog_funk();	why?
   }
   pp = &C;
   pd = dynamic_cast<dog*>(pp);
   if (!pd) {
      cerr << "pd = dynamic_cast<dog*>(pp) failed the second time\n";
      // pd->non_virtual_dog_funk();	why?
   }
}