例:如图,类图和内存图,实现链式输出 ①
#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(); }