#include <iostream>
using namespace std;
class Base
{
public:
virtual void Fun_1(){}
virtual void Fun_2(){}
virtual void Fun_3(){}
};
class BaseComp : public Base
{
public:
BaseComp():m_pBase(NULL){}
BaseComp(Base* pBase):m_pBase(pBase){}
virtual void Fun_1()
{
if(m_pBase)
m_pBase->Fun_1();
}
virtual void Fun_2()
{
if(m_pBase)
m_pBase->Fun_2();
}
virtual void Fun_3()
{
if(m_pBase)
m_pBase->Fun_3();
}
protected:
Base* m_pBase;
};
class Derive_1 : public BaseComp
{
public:
Derive_1(){}
Derive_1(Base* pBase):BaseComp(pBase){}
virtual void Fun_1(){cout<<"Derive_1 Executed"<<endl;}
};
class Derive_2 : public BaseComp
{
public:
Derive_2(){}
Derive_2(Base* pBase):BaseComp(pBase){}
virtual void Fun_2(){cout<<"Derive_2 Executed"<<endl;}
};
class Derive_3 : public BaseComp
{
public:
Derive_3(){}
Derive_3(Base* pBase):BaseComp(pBase){}
virtual void Fun_3(){cout<<"Derive_3 Executed"<<endl;}
};
int main() {
Base* p1=new Derive_1(new Derive_2());
cout<<"p1:"<<endl;
p1->Fun_1();
p1->Fun_2();
p1->Fun_3();
cout<<endl<<"p2:"<<endl;
Base* p2=new Derive_2(new Derive_3());
p2->Fun_1();
p2->Fun_2();
p2->Fun_3();
cout<<endl<<"p3:"<<endl;
Base* p3=new Derive_1(new Derive_3());
p3->Fun_1();
p3->Fun_2();
p3->Fun_3();
cout<<endl<<"p4:"<<endl;
Base* p4=new Derive_1(new Derive_3(new Derive_2()));
p4->Fun_1();
p4->Fun_2();
p4->Fun_3();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKY2xhc3MgQmFzZQp7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBGdW5fMSgpe30KICAgIHZpcnR1YWwgdm9pZCBGdW5fMigpe30KICAgIHZpcnR1YWwgdm9pZCBGdW5fMygpe30KfTsKIApjbGFzcyBCYXNlQ29tcCA6IHB1YmxpYyBCYXNlCnsKcHVibGljOgogICAgQmFzZUNvbXAoKTptX3BCYXNlKE5VTEwpe30KICAgIEJhc2VDb21wKEJhc2UqIHBCYXNlKTptX3BCYXNlKHBCYXNlKXt9CiAgICB2aXJ0dWFsIHZvaWQgRnVuXzEoKQogICAgewogICAgICAgIGlmKG1fcEJhc2UpCiAgICAgICAgICAgIG1fcEJhc2UtPkZ1bl8xKCk7CiAgICB9CiAgICB2aXJ0dWFsIHZvaWQgRnVuXzIoKQogICAgewogICAgICAgIGlmKG1fcEJhc2UpCiAgICAgICAgICAgIG1fcEJhc2UtPkZ1bl8yKCk7CiAgICB9CiAgICB2aXJ0dWFsIHZvaWQgRnVuXzMoKQogICAgewogICAgICAgIGlmKG1fcEJhc2UpCiAgICAgICAgICAgIG1fcEJhc2UtPkZ1bl8zKCk7CiAgICB9CnByb3RlY3RlZDoKICAgIEJhc2UqIG1fcEJhc2U7Cn07CmNsYXNzIERlcml2ZV8xIDogcHVibGljIEJhc2VDb21wCnsKcHVibGljOgogICAgRGVyaXZlXzEoKXt9CiAgICBEZXJpdmVfMShCYXNlKiBwQmFzZSk6QmFzZUNvbXAocEJhc2Upe30KICAgIHZpcnR1YWwgdm9pZCBGdW5fMSgpe2NvdXQ8PCJEZXJpdmVfMSBFeGVjdXRlZCI8PGVuZGw7fQp9OwogCmNsYXNzIERlcml2ZV8yIDogcHVibGljIEJhc2VDb21wCnsgICAKcHVibGljOgogICAgRGVyaXZlXzIoKXt9CiAgICBEZXJpdmVfMihCYXNlKiBwQmFzZSk6QmFzZUNvbXAocEJhc2Upe30KICAgIHZpcnR1YWwgdm9pZCBGdW5fMigpe2NvdXQ8PCJEZXJpdmVfMiBFeGVjdXRlZCI8PGVuZGw7fQp9OwogCmNsYXNzIERlcml2ZV8zIDogcHVibGljIEJhc2VDb21wCnsKcHVibGljOgogICAgRGVyaXZlXzMoKXt9CiAgICBEZXJpdmVfMyhCYXNlKiBwQmFzZSk6QmFzZUNvbXAocEJhc2Upe30KICAgIHZpcnR1YWwgdm9pZCBGdW5fMygpe2NvdXQ8PCJEZXJpdmVfMyBFeGVjdXRlZCI8PGVuZGw7fQp9OwogCiAKaW50IG1haW4oKSB7CiAgICAgICAgCiAgICBCYXNlKiBwMT1uZXcgRGVyaXZlXzEobmV3IERlcml2ZV8yKCkpOwogICAgY291dDw8InAxOiI8PGVuZGw7CiAgICBwMS0+RnVuXzEoKTsKICAgIHAxLT5GdW5fMigpOwogICAgcDEtPkZ1bl8zKCk7CiAgICAKICAgIGNvdXQ8PGVuZGw8PCJwMjoiPDxlbmRsOwogICAgQmFzZSogcDI9bmV3IERlcml2ZV8yKG5ldyBEZXJpdmVfMygpKTsKICAgIHAyLT5GdW5fMSgpOwogICAgcDItPkZ1bl8yKCk7CiAgICBwMi0+RnVuXzMoKTsKICAgIAogICAgY291dDw8ZW5kbDw8InAzOiI8PGVuZGw7CiAgICBCYXNlKiBwMz1uZXcgRGVyaXZlXzEobmV3IERlcml2ZV8zKCkpOwogICAgcDMtPkZ1bl8xKCk7CiAgICBwMy0+RnVuXzIoKTsKICAgIHAzLT5GdW5fMygpOwogICAgCiAgICBjb3V0PDxlbmRsPDwicDQ6Ijw8ZW5kbDsKICAgIEJhc2UqIHA0PW5ldyBEZXJpdmVfMShuZXcgRGVyaXZlXzMobmV3IERlcml2ZV8yKCkpKTsKICAgIHA0LT5GdW5fMSgpOwogICAgcDQtPkZ1bl8yKCk7CiAgICBwNC0+RnVuXzMoKTsKICAgIHJldHVybiAwOwp9