#include
using namespace std;
class Mammal
{
public:
Mammal():itsAge(1) { cout << "Mammal constructor..." << endl; }
virtual ~Mammal() { cout << "Mammal destructor..." << endl; }
Mammal (const Mammal & rhs);
virtual void Speak() const { cout << "Mammal speak!" << endl; }
virtual Mammal* Clone() { return new Mammal(*this); }
int GetAge()const { return itsAge; }
protected:
int itsAge;
};
Mammal::Mammal (const Mammal & rhs):itsAge(rhs.GetAge())
{
cout << "Mammal Copy Constructor..." << endl;
}
class Dog : public Mammal
{
public:
Dog() { cout << "Dog constructor..." << endl; }
virtual ~Dog() { cout << "Dog destructor..." << endl; }
Dog (const Dog & rhs);
void Speak()const { cout << "Woof!" << endl; }
virtual Mammal* Clone() { return new Dog(*this); }
};
Dog::Dog(const Dog & rhs):
Mammal(rhs)
{
cout << "Dog copy constructor..." << endl;
}
class Cat : public Mammal
{
public:
Cat() { cout << "Cat constructor..." << endl; }
~Cat() { cout << "Cat destructor..." << endl; }
Cat (const Cat &);
void Speak()const { cout << "Meow!" << endl; }
virtual Mammal* Clone() { return new Cat(*this); }
};
Cat::Cat(const Cat & rhs):
Mammal(rhs)
{
cout << "Cat copy constructor..." << endl;
}
enum ANIMALS { MAMMAL, DOG, CAT};
const int NumAnimalTypes = 3;
int main()
{
Mammal *theArray[NumAnimalTypes];
Mammal* ptr;
ptr = new Dog;
theArray[0] = ptr;
ptr = new Cat;
theArray[1] = ptr;
ptr = new Mammal;
theArray[2] = ptr;
Mammal *OtherArray[NumAnimalTypes];
for (int i=0;i {
theArray[i]->Speak();
OtherArray[i] = theArray[i]->Clone();
}
for (int i=0;i OtherArray[i]->Speak();
return 0;
}