本帖最后由 dxxds 于 2013-4-20 10:07 编辑
给你的故事,C++的兴趣入门 12
感觉之前的都写的太长了,会有很多人看不下去,所以这次我写短,希望能有人继续关注
上一节课已经写了职业的具体分工实现,那有了职业,咱就要给各个职业加上不同的技能,不然你可不会玩它
class role //角色
{
public:
int LV; //等级
int HP; //血值
int AT; //攻击力
void show_state();
virtual ~role(){ cout<<"删除了role资源"<<endl;}; //虚函数,为了能执行子类析构函数,顺利删除资源而写。这句会被子类析构函数覆盖,实际上不会执行
virtual void skill()=0; //虚函数,为了能调用子类的同名函数
};
void role::show_state()
{
cout<<"等级:"<<LV<<"血量:"<<HP<<"攻击力:"<<AT<<endl<<endl;
}
class warrior : public role //战士,继承了角色类
{
public:
warrior()
{
LV=1; HP=100; AT=10; cout<<"初始化了战士属性"<<endl;
}
~warrior()
{
cout<<"删除了战士资源"<<endl<<endl;
}
void skill()
{
cout<<"战士技:劈砍!"<<endl;
}
};
class magician : public role //法师,继承了角色类
{
public:
magician()
{
LV=1; HP=50; AT=20; cout<<"初始化了法师属性"<<endl;
}
~magician()
{
cout<<"删除了法师资源"<<endl<<endl;
}
void skill()
{
cout<<"法师技:冰箭!"<<endl;
}
};
int main()
{
role* player = new warrior; //role变成了战士
player->skill(); //自然这里就是战士的技能
delete player; //删了它,接下来让它变成法师
player = new magician; //变成了法师
player->skill(); //自然这里就是法师的技能
delete player; //删了它 准备结束程序
system(pause>nul);
return 0;
}
可以看到我相对上一节课,只是在role类里多增加了一个skill的函数和一个~role的析构函数,并在之前加了一个virtual,表示这个函数是虚的。
这个虚函数类似一个JAVA里的interface,也就是接口。意思是让所有继承role的类,都必须实现这个函数,不然就报错
至于为什么要写这个函数?
因为role自己不知道将来在main里会变成战士还是法师,所以这里空下,交给子类实现。
但是这个函数必须要有,因为role不能调用子类有的而父类(也就是role自己)没有的函数方法
虚函数有两种,一种是可以自己(父类)实现的,还有一种是自己(父类)不能实现的
能实现的那种,前面加上“virtual”,然后直接写就行了。
不能实现的,前面加上“virtual”,后面加上 “=0”,就行了。
虚函数和一般函数的区别是啥?
区别就是,看下面这句
role* player = new warrior;
这句代码里有两个类,一个是role,一个是warrior
那如果这两个类里都有一个同名函数,那player执行哪个?
答案就是
如果函数是虚函数,就执行player子类的(warrior)
如果它不是虚函数,就执行player自己的(role)
OK 没啥难的吧?那就到这啦。