//: C14:Inheritance.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Simple inheritance

#include "Useful.h"
#include <iostream>
using namespace std;

/* L'istruzione immediatamente sotto indica che stiamo definendo una classe derivata della classe "X" definita in "Useful.h".*/

class Y : public X
{

int i;

/* L'attributo sopra è diverso da quello definito nella classe "X", poiché quello della classe "X" è un attributo "private" e quindi non visibile alla classe derivate "Y".*/
/* Different from X's i */

public:

Y() { i = 0; }
int change()
{

i = permute();

/* Essendo "Y" una classe derivata da "X" posso richiamare il metodo "permute()" poiché grazie all'ereditarietà è come se tale metodo fosse definito nella classe "Y".*/
/* Different name call */

return i;

}

void set(int ii)
{

i = ii;
X::set(ii);

/* L'istruzione sopra richiama il metodo "set" della classe "X".*/
/* Same-name function call */

}

};

int main()
{

cout << "sizeof(X) = " << sizeof(X) << endl;
cout << "sizeof(Y) = " << sizeof(Y) << endl;
Y D;
D.change();
/* X function interface comes through: */
D.read();
D.permute();
/* Redefined functions hide base versions: */
D.set(12);

} ///:~