#include <iostream>

using namespace std;


class myBase
{
public:
  myBase() {basevalue=2;} // default constructor for base class
  void show() {cout << basevalue << endl;}
protected:
  void protectedshow() {cout << "Protected: " << basevalue << endl;}
private:
  long basevalue;
};


class myDerived : public myBase
{
public:
  myDerived() { derivedvalue=3; } // default constructor for derived class
  void laatzien() { cout << derivedvalue << endl; }
  void use_protected() { protectedshow(); }
private:
  long derivedvalue;
};


int main()
{
myDerived md; // default constructor uit derived EN base worden aangeroepen

  /*
   * Een object van derived class mag zelf (met functies uit het derived
   * class gedeelte) een protected functie uit het base class gedeelte
   * aanroepen.
   * Deze gedraagt zich namelijk alsof het een private functie is: beschikbaar
   * voor het object zelf, maar niet van buiten aan te roepen.
   *
   * Dit in tegenstelling tot een functie uit het private base class deel.
   * Die mag alleen door functies uit het base class deel gebruikt worden.
   */
  cout << "\nCall protected use_protected() from derived class part\n";
  md.use_protected(); // roep protected functie uit derived-deel aan

  /*
   * van 'buiten' aanroepen van protected functies mag niet
   */
  // md.protectedshow(); // mag niet want is protected in base gedeelte

} // main()

