您的位置:首页 > 其它

虚函数的简单应用

2010-01-28 15:22 134 查看
  代码只是示例了虚函数的一些应用,并不是说在该场景下这样用最好,甚至于说,几乎不会出现这样的用法。但这可以让初学者加深对虚函数的理解。


//受到上面平行类的启发,利用菱形继承,提供数据,实现一个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;
}


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: