#include <stdio.h>
#include<iostream>
using namespace std;
class Mammal
{
public:
Mammal() : itsAge(1) {printf("\nKONSTRUKTOR Mammal %p\n",this);}
Mammal(int Age) : itsAge(Age) {printf("\nKONSTRUKTOR Mammal 2 %p\n",this);}
virtual ~Mammal() {printf("\nDESTRUKTOR Mammal %p\n",this);}
Mammal(const Mammal & rhs);
virtual void Speak() const {printf("\nMammal speak! %p\n",this);}
int GetAge() const {printf("\nMammal GetAge() %p\n",this); return itsAge;}
virtual Mammal * clone() const
{
printf("\nMammal Clone() %p\n",this);
return new Mammal(*this);
}
protected:
int itsAge;
};
Mammal :: Mammal(const Mammal & rhs) : itsAge(rhs. GetAge())
{printf("\nKONSTRUKTOR COPY Mammal this = %p &rhs = %p\n",this,&rhs);}
class Dog : public Mammal
{
public:
Dog() {printf("\nKONSTRUKTOR Dog %p\n",this);}
Dog(int Age) : Mammal(Age) {printf("\nKONSTRUKTOR Dog 2 %p\n",this);}
virtual ~Dog() {printf("\nDESTRUKTOR Dog %p\n",this);}
Dog(const Dog & rhs);
void Speak() const {printf("\nWoof! %p\n",this);}
virtual Dog * clone() const
{
return new Dog(*this);
}
};
Dog :: Dog(const Dog & rhs) : Mammal(rhs)
{printf("\nKONSTRUKTOR COPY Dog this = %p &rhs = %p\n",this,&rhs);}
int main()
{
Mammal *ptr;
printf("\n*****************\n");
ptr = new Dog(45);
printf("\n*** ptr = %p\n",ptr);
printf("\n*** Age = %d\n",ptr->GetAge());
Mammal * A = ptr -> clone();
printf("\n*** A = %p\n",A);
printf("\n*** Age = %d\n",A->GetAge());
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CgojaW5jbHVkZTxpb3N0cmVhbT4KIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCmNsYXNzIE1hbW1hbAogCnsKIApwdWJsaWM6CiAKICAgIE1hbW1hbCgpIDogaXRzQWdlKDEpIHtwcmludGYoIlxuS09OU1RSVUtUT1IgTWFtbWFsICVwXG4iLHRoaXMpO30KIAogICAgTWFtbWFsKGludCBBZ2UpIDogaXRzQWdlKEFnZSkge3ByaW50ZigiXG5LT05TVFJVS1RPUiBNYW1tYWwgMiAlcFxuIix0aGlzKTt9CiAKICAgIHZpcnR1YWwgfk1hbW1hbCgpIHtwcmludGYoIlxuREVTVFJVS1RPUiBNYW1tYWwgJXBcbiIsdGhpcyk7fQogCiAgICBNYW1tYWwoY29uc3QgTWFtbWFsICYgcmhzKTsKIAogICAgdmlydHVhbCB2b2lkIFNwZWFrKCkgY29uc3Qge3ByaW50ZigiXG5NYW1tYWwgc3BlYWshICVwXG4iLHRoaXMpO30KIAogICAgaW50IEdldEFnZSgpIGNvbnN0IHtwcmludGYoIlxuTWFtbWFsIEdldEFnZSgpICVwXG4iLHRoaXMpOyByZXR1cm4gaXRzQWdlO30KIAogICAgdmlydHVhbCBNYW1tYWwgKiBjbG9uZSgpIGNvbnN0CiAKICAgIHsKICAgICAgICBwcmludGYoIlxuTWFtbWFsIENsb25lKCkgJXBcbiIsdGhpcyk7IAogCiAgICAgICAgcmV0dXJuIG5ldyBNYW1tYWwoKnRoaXMpOwogICAgfQogCnByb3RlY3RlZDoKIAogICAgaW50IGl0c0FnZTsKfTsKIApNYW1tYWwgOjogTWFtbWFsKGNvbnN0IE1hbW1hbCAmIHJocykgOiBpdHNBZ2UocmhzLiBHZXRBZ2UoKSkKIAp7cHJpbnRmKCJcbktPTlNUUlVLVE9SIENPUFkgTWFtbWFsIHRoaXMgPSAlcCAmcmhzID0gJXBcbiIsdGhpcywmcmhzKTt9CiAKY2xhc3MgRG9nIDogcHVibGljIE1hbW1hbAogCnsKIApwdWJsaWM6CiAKICAgIERvZygpIHtwcmludGYoIlxuS09OU1RSVUtUT1IgRG9nICVwXG4iLHRoaXMpO30KIAogICAgRG9nKGludCBBZ2UpIDogTWFtbWFsKEFnZSkge3ByaW50ZigiXG5LT05TVFJVS1RPUiBEb2cgMiAlcFxuIix0aGlzKTt9CiAKICAgIHZpcnR1YWwgfkRvZygpIHtwcmludGYoIlxuREVTVFJVS1RPUiBEb2cgJXBcbiIsdGhpcyk7fQogCiAgICBEb2coY29uc3QgRG9nICYgcmhzKTsKIAogICAgdm9pZCBTcGVhaygpIGNvbnN0IHtwcmludGYoIlxuV29vZiEgJXBcbiIsdGhpcyk7fQogCiAgICAgdmlydHVhbCBEb2cgKiBjbG9uZSgpIGNvbnN0CiAgICB7CiAgICAgICAgcmV0dXJuIG5ldyBEb2coKnRoaXMpOwogICAgfQp9OwogCkRvZyA6OiBEb2coY29uc3QgRG9nICYgcmhzKSA6IE1hbW1hbChyaHMpCiAKe3ByaW50ZigiXG5LT05TVFJVS1RPUiBDT1BZIERvZyB0aGlzID0gJXAgJnJocyA9ICVwXG4iLHRoaXMsJnJocyk7fQogCiAKIAppbnQgbWFpbigpCiAKewogICAgTWFtbWFsICpwdHI7CiAKICAgIAogICAgcHJpbnRmKCJcbioqKioqKioqKioqKioqKioqXG4iKTsKIAogICAgcHRyID0gbmV3IERvZyg0NSk7CiAKICAgIHByaW50ZigiXG4qKiogcHRyID0gJXBcbiIscHRyKTsKIAogICAgcHJpbnRmKCJcbioqKiBBZ2UgPSAlZFxuIixwdHItPkdldEFnZSgpKTsKIAogICAgTWFtbWFsICogQSA9IHB0ciAtPiBjbG9uZSgpOwogCiAgICAgcHJpbnRmKCJcbioqKiBBID0gJXBcbiIsQSk7CiAKICAgICBwcmludGYoIlxuKioqIEFnZSA9ICVkXG4iLEEtPkdldEFnZSgpKTsKIAogICAgCiAKICAgIHJldHVybiAwOwp9