//: C15:Instrument5.cpp
// From Thinking in C++, 2nd Edition
// Available at http://www.BruceEckel.com
// (c) Bruce Eckel 2000
// Copyright notice in Copyright.txt
// Pure abstract base classes
#include <iostream>
using namespace std;
enum note { middleC, Csharp, Cflat };
/* Etc. */class Instrument
{
public:
/* Le member function seguenti dichiarate "virtual" vengono successivamente ridefinite all'interno della classe "Wind". Con tale operazione, la function "play" della classe "Instrumente", per esempio, viene totalmentente ridefinita all'interno della classe "Wind".(Lo stesso vale per tutte le member function definite nelle classi sottostanti.) */
/* Pure virtual functions: */
virtual void play(note) const = 0;
virtual char* what() const = 0;
/* Assume this will modify the object: */
virtual void adjust(int) = 0;};
/* Rest of the file is the same ... */class Wind : public Instrument
{
public:
void play(note) const
{
cout << "Wind::play" << endl;
}
char* what() const { return "Wind"; }
void adjust(int) {}};
class Percussion : public Instrument
{
public:
void play(note) const
{
cout << "Percussion::play" << endl;
}
char* what() const { return "Percussion"; }
void adjust(int) {}};
class Stringed : public Instrument
{
public:
void play(note) const
{
cout << "Stringed::play" << endl;
}
char* what() const { return "Stringed"; }
void adjust(int) {}};
class Brass : public Wind
{
public:
void play(note) const
{
cout << "Brass::play" << endl;
}
char* what() const { return "Brass"; }
};
class Woodwind : public Wind
{
public:
void play(note) const
{
cout << "Woodwind::play" << endl;
}
char* what() const { return "Woodwind"; }};
/* Identical function from before: */
void tune(Instrument& i)
{
/* ... */
i.play(middleC);}
/* New function: */
void f(Instrument& i) { i.adjust(1); }/* Il "main" chiaramente dichiara pił oggetti utilizzando pił classi. La funzione "tune", chiama le varie funzioni "play" ridefinite (come detto sopra) in ciascuna della varie classi.*/
int main()
{
Wind flute;
Percussion drum;
Stringed violin;
Brass flugelhorn;
Woodwind recorder;
tune(flute);
tune(drum);
tune(violin);
tune(flugelhorn);
tune(recorder);
f(flugelhorn);} ///:~