#include <iostream>

/* dangers of shadowing a data member */

using namespace std;

class A1{
public:
    int data;
    virtual void print(){cout << data << "is in an A1" << endl; return;}
    virtual void print2(){cout << data << "print 2 is in an A1" << endl; return;}
    A1(int start = 5): data(start) {}
};

class A2: public A1{
public:

    virtual void print(){cout << data << "is in an A2" << endl; return;}

};

int main(){

    A1 * a1Ptr;
    A2 a2;
    a2.print();
    a2.print2();

    a1Ptr = &a2;
    a1Ptr->print(); //want A2 behavior
    a1Ptr->print2(); 
    return 0;
}

