#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;
}