// name: virtual.cpp
// desc: demonstration of virtual vs. non-virtual functions in C++

#include <iostream>
using namespace std;

// our parent class
class Parent
{
public:
    // virtual function
    virtual void foo()
    {
        cout << "I am Parent!" << endl;
    }
    
    // non-virtual function
    void concrete()
    {
        cout << "I am concrete Parent!" << endl;
    }
};

// our child class
class Child : public Parent
{
public:
    // virtual function
    virtual void foo()
    {
        cout << "I am Child!" << endl;
    }
    
    // non-virtual function
    void concrete()
    {
        cout << "I am concrete Child!" << endl;
    }
};


// entry point
int main( )
{
    // instantiate a Parent
    Parent * p = new Parent;
    // instantiate a Child
    Child * c = new Child;

    // call the virtual functions
    p->foo();
    c->foo();

    // call the non-virtual function
    p->concrete();
    c->concrete();

    // make a parent pointer, point it at our child instance
    Parent * p2 = (Parent *)c;

    // call virtual and non-virtual functions, observe output
    p2->foo();
    p2->concrete();

    return 0;
}
