类间通信-继承当中类间

来源:互联网 发布:手机查看gta5角色数据 编辑:程序博客网 时间:2024/06/05 09:10

例:如图,类图和内存图,实现链式输出
这里写图片描述

#include<iostream>using namespace std;class Base{protected:Base *next;public:    Base()    {        cout<<"Base create"<<endl;    }    virtual void fun()=0;    virtual ~Base()    {        cout<<"Base des"<<endl;    }};class D1:public Base{private:int x;public:    D1()    {        x=0;        next=NULL;        cout<<"D1()"<<endl;    }    D1(int i,Base *t)    {        x=i;        next=t;        cout<<"D1(int,Base *)"<<endl;    }    void fun()    {        cout<<"x="<<x<<endl;        if(next)            next->fun();    }    ~D1()    {        cout<<"D1 des"<<endl;    }};class D2:public Base{private:int y;public:    D2()    {        y=0;        next=NULL;        cout<<"D2()"<<endl;    }    D2(int i,Base *t)    {        y=i;        next=t;        cout<<"D2(int,Base *)"<<endl;    }    void fun()    {        cout<<"y="<<y<<endl;        if(next)            next->fun();    }    ~D2()    {        cout<<"D2 des"<<endl;    }};class D3:public Base{private:int z;public:    D3()    {        z=0;        next=NULL;        cout<<"D3()"<<endl;    }    D3(int i,Base *t)    {        z=i;        next=t;        cout<<"D3(int,Base *)"<<endl;    }    void fun()    {        cout<<"z="<<z<<endl;        if(next)            next->fun();    }    ~D3()    {        cout<<"D3 des"<<endl;    }};class My{private:Base *pBase;public:    My(Base *t)    {        pBase=t;        cout<<"My(Base *)"<<endl;    }    void dofun()    {        pBase->fun();    }    ~My()    {        cout<<"My des"<<endl;    }};int main(void){    D3 *pD3=new D3(5,NULL);    D2 *pD2=new D2(4,pD3);    Base *pD1=new D1(3,pD2);    My *pMy=new My(pD1);    pMy->dofun();    delete pD1;    delete pD2;    delete pD3;    delete pMy;    return 0;}

②将next改为私有,需要添加WinNext()方法的来获取next

#include<iostream>using namespace std;class Base{private:Base *next;public:    Base()    {        next=NULL;        cout<<"Base create"<<endl;    }    Base(Base *t)    {        next=t;        cout<<"Base create"<<endl;    }    virtual void fun()=0;    void WinNext()    {        if(next)            next->fun();    }    virtual ~Base()    {        cout<<"Base des"<<endl;    }};class D1:public Base{private:int x;public:    D1()    {        x=0;        cout<<"D1()"<<endl;    }    D1(int i,Base *t):Base(t)    {        x=i;        cout<<"D1(int,Base *)"<<endl;    }    void fun()    {        cout<<"x="<<x<<endl;        WinNext();    }    ~D1()    {        cout<<"D1 des"<<endl;    }};class D2:public Base{private:int y;public:    D2()    {        y=0;        cout<<"D2()"<<endl;    }    D2(int i,Base *t):Base(t)    {        y=i;        cout<<"D2(int,Base *)"<<endl;    }    void fun()    {        cout<<"y="<<y<<endl;        WinNext();    }    ~D2()    {        cout<<"D2 des"<<endl;    }};class D3:public Base{private:int z;public:    D3()    {        z=0;        cout<<"D3()"<<endl;    }    D3(int i,Base *t):Base(t)    {        z=i;        cout<<"D3(int,Base *)"<<endl;    }    void fun()    {        cout<<"z="<<z<<endl;        WinNext();    }    ~D3()    {        cout<<"D3 des"<<endl;    }};class My{private:Base *pBase;public:    My(Base *t)    {        pBase=t;        cout<<"My(Base *)"<<endl;    }    void dofun()    {        pBase->fun();    }    ~My()    {        cout<<"My des"<<endl;    }};int main(void){    D3 *pD3=new D3(5,NULL);    D2 *pD2=new D2(4,pD3);    Base *pD1=new D1(3,pD2);    My *pMy=new My(pD1);    pMy->dofun();    delete pD1;    delete pD2;    delete pD3;    delete pMy;    return 0;}

③若将x,y,z全部统一为data,则可将纯虚函数改为虚函数,来替代WinNext()不推荐使用

virtual void fun(){    cout<<data;    if(next)        next->fun();}