c++中虚函数的简单应用

baihacker 2010-01-23 01:25:45
加精
作者:baihacker
来源:http://hi.baidu.com/feixue http://hi.csdn.net/baihacker

本来是题目是:无聊时写了一点c++代码
后来发现都和虚函数有关,于是就把题目名字改了
其实我也不知道为什么要写这个,就随便写写吧。

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


//继承多个接口,但是有相同的方法
#include <iostream>
using namespace std;

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 o;
IHello& ih = o;
IWorld& iw = o;
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 o;
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;
}

...全文
6256 278 打赏 收藏 转发到动态 举报
写回复
用AI写文章
278 条回复
切换为时间正序
请发表友善的回复…
发表回复
gucheng789 2011-08-13
  • 打赏
  • 举报
回复


水平有限,读不懂
xyy19920105 2011-02-15
  • 打赏
  • 举报
回复
有些用处
中国007程序员 2011-01-13
  • 打赏
  • 举报
回复
学习了,不过我只是个新手,能写些常用的嘛?谢谢!
haizhilanno1 2010-12-09
  • 打赏
  • 举报
回复
学习学习~!
xiao_yanjing 2010-12-01
  • 打赏
  • 举报
回复
写的是不错。就是没看懂
gino98 2010-10-22
  • 打赏
  • 举报
回复
学习,顺便整份
seraphbest 2010-10-05
  • 打赏
  • 举报
回复
up ~~~~
zte_xiaohuazi 2010-08-29
  • 打赏
  • 举报
回复
不错,牛
haoruixiang 2010-08-24
  • 打赏
  • 举报
回复
给 我这个新手 点分吧 下个 文件也要分 穷啊
cobra_chen 2010-08-06
  • 打赏
  • 举报
回复
可以,正好最近纠结类里的虚函数呢
gancongjun 2010-06-29
  • 打赏
  • 举报
回复
学习 很好
liyuxia713 2010-06-19
  • 打赏
  • 举报
回复
学习中
AAA20090987 2010-06-19
  • 打赏
  • 举报
回复
精品不收藏是罪过,MARK
颖哥儿 2010-06-09
  • 打赏
  • 举报
回复
呵呵,谢谢楼主分享。
chenjunxyf 2010-05-26
  • 打赏
  • 举报
回复
太强了。。。。
yezi111 2010-05-10
  • 打赏
  • 举报
回复
学习了
VirusInLife 2010-05-09
  • 打赏
  • 举报
回复
mark
BullWeiHaiDong 2010-04-18
  • 打赏
  • 举报
回复
不错哦,看到一些以前没留意到的东西
linsen_519 2010-04-09
  • 打赏
  • 举报
回复
mark
keristef 2010-02-26
  • 打赏
  • 举报
回复

【招聘】月薪10K起招聘C++开发工程师

http://topic.csdn.net/u/20100225/17/d973b9b7-1a5b-4a31-99f9-5347a973aa81.html?seed=157601369&r=63586978#r_63586978

将http后面的标点符号换作英文的即可
加载更多回复(258)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧