/* ex_5_3.c++ */
#include <iostream>
#include <string>
using namespace std;

/* *** identifiable *** */
class identifiable {
	string article;
protected:
	void set_genre(const int&);
	string get_article() const { return article; };
public:
        virtual string get_identification() const = 0;
};

void identifiable::set_genre(const int& genre) {
	switch (genre) {
  		case 1:
			article = "Un ";
			break;
  		case 2:
			article = "Une ";
			break;
		default:
			article = "";
	}
}

/* *** utile *** */
class utile {
public:
        virtual string get_fonction() const = 0;
};

/* *** objet *** */
class objet : public identifiable, public utile {
	string nom, fonction;

public:
	objet(string n, string f, int genre);
	string get_identification () const { return (get_article() + nom); };
	string get_fonction () const { return fonction; };
};

objet::objet(string n, string f, int genre=0) :
	nom(n),
	fonction(f) {
	set_genre(genre);
}


/* *** main *** */
int main (void) {
//	identifiable i; // provoque une erreur à la compilation
	objet o("balle", "rebondit", 2);
	string verite = o.get_identification();
	verite += " ";
	verite += o.get_fonction();
	verite += ".";
	cout << verite << endl;
	return 0;
}
