// Listing 12.8 Using virtual methods

#include <iostream>
using namespace std;

class Mammal
{
public:
	Mammal():itsAge(1) { cout << "Mammal constructor...\n"; }
	~Mammal() { cout << "Mammal destructor...\n"; }
	void Move() const { cout << "Mammal move one step\n"; }
	virtual void Speak() const { cout << "Mammal speak!\n"; }

protected:
	int itsAge;
};

class Dog : public Mammal
{
public:
	Dog() { cout << "Dog Constructor...\n"; }
	~Dog() { cout << "Dog destructor...\n"; }
	void WagTail() { cout << "Wagging Tail...\n"; }
	void Speak()const { cout << "Woof!\n"; }
	void Move()const { cout << "Dog moves 5 steps...\n"; }
};

int main()
{
	Mammal *pDog = new Dog;		// Mammal constructor...
								// Dog Constructor...
	pDog->Move();				// Mammal move one step
	pDog->Speak();				// Woof!
	return 0;
}
