// Listing 13.4
// Calling multiple constructors

#include <iostream>
using namespace std;

typedef int HANDS;
enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown };
enum BOOL { FALSE=0, TRUE=-5 };

class Horse
{
public:
	Horse(COLOR color, HANDS height);
	virtual ~Horse() { cout << "Horse destructor...\n"; }
	virtual void Whinny()const { cout << "Whinny!... "; }
	virtual HANDS GetHeight() const { return itsHeight; }
	virtual COLOR GetColor() const { return itsColor; }
private:
	HANDS itsHeight;
	COLOR itsColor;
};

Horse::Horse(COLOR color, HANDS height):itsColor(color),itsHeight(height)
{
	cout << "Horse constructor...\n";
}

class Bird
{
public:
	Bird(COLOR color, BOOL migrates);
	virtual ~Bird() {cout << "Bird destructor...\n"; }
	virtual void Chirp()const { cout << "Chirp... "; }
	virtual void Fly()const
	{
		cout << "I can fly! I can fly! I can fly! ";
	}
	virtual COLOR GetColor()const { return itsColor; }
	virtual BOOL GetMigration() const { return itsMigration; }
private:
	COLOR itsColor;
	BOOL itsMigration;
};


Bird::Bird(COLOR color, BOOL migrates):itsColor(color), itsMigration(migrates)
{
	cout << "Bird constructor...\n";
}

class Pegasus : public Bird, public Horse
{
public:
	void Chirp()const { Whinny(); }
	Pegasus(COLOR, HANDS, BOOL,long);
	~Pegasus() {cout << "Pegasus destructor...\n";}
	virtual long GetNumberBelievers() const
	{
		return itsNumberBelievers;
	}

private:
	long itsNumberBelievers;
};

Pegasus::Pegasus(COLOR aColor, HANDS height, BOOL migrates, long NumBelieve) : Horse(aColor, height), Bird(aColor, migrates), itsNumberBelievers(3)
{
	cout << "Pegasus constructor...\n";
}

	int main()
	{
		Pegasus *pPeg = new Pegasus(Red, 5, TRUE, 10);	// Horse, Bird, Pegasus constructors
		pPeg->Fly();	// I can fly! I can fly! I can fly!
		pPeg->Whinny();	// Whinny!
		cout << "\nYour Pegasus is " << pPeg->GetHeight(); // Your Pegasus is 5
		cout << " hands tall and ";
		if (pPeg->GetMigration())		// it does migrate
			cout << "it does migrate.";
		else
			cout << "it does not migrate.";
		
		cout << "\nA total of " << pPeg->GetNumberBelievers();
		cout << " people believe it exists.\n";
		delete pPeg;
		
		return 0;
}
