dxxds
本帖最后由

本帖最后由 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 没啥难的吧?那就到这啦。