虚函数的简单应用
2010-01-28 15:22
134 查看
代码只是示例了虚函数的一些应用,并不是说在该场景下这样用最好,甚至于说,几乎不会出现这样的用法。但这可以让初学者加深对虚函数的理解。
//想到责任链模式,也实现了一个
//但是一个处理者知道下一个处理者
#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;
}
//受到上面平行类的启发,利用菱形继承,提供数据,实现一个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;
}
相关文章推荐
- 动态联编和虚函数的简单应用
- Redis简介和简单应用
- Py2Exe简单应用
- [转]献给初学 Ajax 的 PHPer --Ajax 技术及其简单应用
- Spinner自定义样式的简单应用
- 关于VS2005中GridView的自定义分页,单选、多选、排序、自增列的简单应用
- jQuery 对复选框的简单应用
- 百度地图API的简单应用
- shiro权限项目中的简单应用
- poj 1061 青蛙的约会 扩展gcd的简单应用
- 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务
- hbase filter(过滤器)和coprocessor(协处理器)统计行数的简单应用
- Angular5初探之--构建一个简单的单页应用,包含登录(login)和几个一级菜单
- PHP中的cURL的简单应用
- jetty嵌入式应用的简单案例
- 最简单的的让应用软件不随着系统重装而重装的方法
- Hibernate 中 formula的简单应用
- Ansible的简单应用
- hibernate简单应用
- Recyclerview的简单应用