代码只是示例了虚函数的一些应用,并不是说在该场景下这样用最好,甚至于说,几乎不会出现这样的用法。但这可以让初学者加深对虚函数的理解。
//继承多个接口,但是有相同的方法
#include <iostream>
class IHello
{
public:
virtual void Say()=0;
};
class IWorld
{
public:
virtual void Say()=0;
};
class MHello:public IHello
{
public:
void Say(){cout<<"Hello";}
};
class MWorld:public IWorld
{
public:
void Say(){cout<<"World"<<endl;}
};
class CObject:public MHello,public MWorld
{
};
int main()
{
CObject 0;
IHello& ih=0;
IWorld& iw=0;
ih.Say();
iw.Say();
return 0;
}
//两个平行类,通过被继承,虚函数,将下一个动作传到另一个类,V形转发
#include <iostream>
using namespace std;
class Hello
{
public:
void Say(){cout<<"Hello";nextH();}
virtual void nextH(){}
};
class World
{
public:
void Say(){cout<<"World";nextW();}
virtual void nextW(){}
};
class CObject:public Hello,public World
{
public:
void nextH()
{
World::Say();
}
void nextW()
{
;
}
};
int main()
{
CObject o;
o.Hello::Say();
return 0;
}
//受到上面平行类的启发,利用菱形继承,提供数据,实现一个switch,处理类似平行的
//但是对每个平行类要有不同签名的调用下一个的虚函数,并且在CObject中对这个处理过程进行编码
#include <iostream>
using namespace std;
class Data
{
public:
int value;
};
class Case1:public virtual Data
{
public:
void process(){if(value==1){cout<<1<<endl;} else next1();}
virtual void next1(){}
};
class Case2:public virtual Data
{
public:
void process(){if(value==2){cout<<2<<endl;} else next2();}
virtual void next2(){}
};
class Default:public virtual Data
{
public:
void process(){cout<<"default"<<endl;}
};
class CObject:public Case1,public Case2,public Default
{
public:
void next1()
{
Case2::process();
}
void next2()
{
Default::process();
}
};
int main()
{
CObject 0;
for(int i=0;i<4;++i)
{
o.value=i;
o.Case1::process();
}
return 0;
}
//想到责任链模式,也实现了一个
//但是一个处理者知道下一个处理者
#include <iostream>
using namespace std;
class MsgProcessor
{
public:
MsgProcessor(MsgProcessor* next=NULL):next_(next){}
virtual void process(int msg)=0;
virtual void dispatch(int msg)
{
if(next_) next_->process(msg);
}
MsgProcessor* next_;
};
class Handler1:public MsgProcessor
{
public:
Handler1(MsgProcessor* next=NULL):MsgProcessor(next)
{
}
void process(int msg)
{
if(msg==1)
{
cout<<1<<endl;
}
else
{
dispatch(msg);
}
}
};
class Handler2:public MsgProcessor
{
public:
Handler2(MsgProcessor* next=NULL):MsgProcessor(next)
{
}
void process(int msg)
{
if(msg==2)
{
cout<<2<<endl;
}
else
{
dispatch(msg);
}
}
};
class HandlerDefault:public MsgProcessor
{
public:
HandlerDefault(MsgProcessor* next=NULL):MsgProcessor(next)
{
}
void process(int msg)
{
cout<<"default"<<endl;
}
};
int main()
{
HandlerDefault dft;
Handler2 h2(&dft);
Handler1 h1(&h2);
for(int i=0;i<4;i++)
{
h1.process(i);
}
return 0;
}
//修饰器模式,好看一点,把终止结点和非终止节点分开了
#include <iostream>
using namespace std;
class Component
{
public:
virtual void process(int msg)=0;
};
class CaseDefault:public Component
{
public:
void process(int msg)
{
cout<<"default"<<endl;
}
};
class CaseNormal:public Component
{
public:
CaseNormal(Component* next=NULL):next_(next)
{
}
virtual void process(int msg)
{
if(next_) next_->process(msg);
}
Component* next_;
};
class Case1:public CaseNormal
{
public:
Case1(Component* next=NULL):CaseNormal(next)
{
}
void process(int msg)
{
if(msg==1)
{
cout<<1<<endl;
}
else
{
CaseNormal::process(msg);
}
}
};
class Case2:public CaseNormal
{
public:
Case2(Component* next=NULL):CaseNormal(next)
{
}
void process(int msg)
{
if(msg==2)
{
cout<<2<<endl;
}
else
{
CaseNormal::process(msg);
}
}
};
int main()
{
CaseDefault dft;
Case2 c2(&dft);
Case1 c1(&c2);
for(int i=0;i<4;++i)
{
c1.process(i);
}
return 0;
}
浙公网安备 33010602011771号