Mega Code Archive

 
Categories / C++ / Class
 

Virtual Copy Constructor

#include <iostream> 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<NumAnimalTypes;i++)    {       theArray[i]->Speak();       OtherArray[i] = theArray[i]->Clone();    }    for (int i=0;i<NumAnimalTypes;i++)       OtherArray[i]->Speak();    return 0; }