//  File:  PuPrPv.cpp  -  PublicProtectedPrivate.cpp
//  Show some accessibilities...

#include <iostream.h>

class Base {
  public:
    Base () { cout << "Base::Base()" << endl;
        nPublic = 1; nProtected = 2; nPrivate = 3;
        Public ();  Protected ();  Private ();
    }
    void Public (void) { cout << "Base::Public - " << nPublic << endl; }
    int GetPrivate (void) { return nPrivate; }
    int nPublic;

  protected:
    void Protected (void) {
        cout << "Base::Protected - " << nProtected << endl;  }
    int GetProtected (void) { return nProtected; }
    int nProtected;

  private:
    void Private (void) { cout << "Base::Private - " << nPrivate << endl; }
    int nPrivate;
};

class Derived : Base {
  public:
    Derived () { cout << "Derived::Derived()" << endl; }
    void GetPrivate (void) {
        cout << "Derived::GetPrivate()" << endl;
        cout << "Base::GetPrivate = " << Base::GetPrivate() << endl;
        cout << "nProtected = " << nProtected << endl;
        // cout << "nPrivate = " << nPrivate << endl;                     NOPE
    }
};

int main (void) {
    cout << "First try Base..." << endl;
    Base base;
    cout << "base.nPrivate = " << base.GetPrivate () << endl;
    // cout << "base.nProtected = " << base.GetProtected () << endl;      NOPE
    cout << endl << "Now try \"Derived\"..." << endl;
    Derived derived;
    derived.GetPrivate ();
    // cout << "Derived::GetProtected" << derived.GetProtected() << endl; NOPE

    return 0;
}

/*  OUTPUT from the program...

First try Base...
Base::Base()
Base::Public - 1
Base::Protected - 2
Base::Private - 3
base.nPrivate = 3

Now try "Derived"...
Base::Base()
Base::Public - 1
Base::Protected - 2
Base::Private - 3
Derived::Derived()
Derived::GetPrivate()
Base::GetPrivate = 3
nProtected = 2

..... */

