Question 6 [5] with sample solutions

Show the precise output from the program below.

#include <iostream>
using namespace std;

class parent1 {
   public:
      virtual void print() = 0;
};

class parent2 {
   public:
      void print() { cout << "print version 1" << endl; }
};

class child1: public parent1 {
   public:
      child1() { cout << "start child type 1" << endl; }
      ~child1() { cout << "end child type 1" << endl; }
      void print() { cout << "print version 2" << endl; }
};

class child2: public parent1 {
   public:
      child2() { cout << "start child type 2" << endl; }
      ~child2() { cout << "end child type 2" << endl; }
      void print() { cout << "print version 3" << endl; }
};

class child3: public parent2 {
   public:
      child3() { cout << "start child type 3" << endl; }
      ~child3() { cout << "end child type 3" << endl; }
      void print() { cout << "print version 4" << endl; }
};

int main()
{
    parent1 *p1 = new child1;
    parent1 *p2;
    child3 c3;
    p1->print();
    p2 = new child2;
    p2->print();
    delete p2;
    c3.print();
}
SAMPLE SOLUTION
start child type 1
start child type 3
print version 0
start child type 2
print version 0
print version 4
end child type 3

NOTES:  because p1 and p2 are pointers to parent1's,
    and because C++ uses static binding by default,
    the p1->print(), p2->print(), and delete p2
    operations all call the parent1 methods, 
    not the child methods.