前几天在用C++的 类库SDL写跑酷小游戏的时候,有个问题一直困扰着我。
对于一个检测碰撞的函数,面对每个新的障碍物类的时候,我都需要重新写一个基本一样的check函数来检测,实在是太麻烦了,代码异常冗余。
今天在学Java的时候看到关于基础类的一个使用技巧突然点醒了我,可以设置一个障碍物基础类Trap(c++中可能需要用visual关键字来修饰...暂时还未测试),让其他的障碍物类
继承自这个基础类,这样,就可以把这个函数改成check_collision(Persons man,Trap trap)
因为其他的障碍物类都是继承自这个障碍物基础Trap的,所以在调用这个函数的时候,编译器会自动识别。
额,好像偏题了......虽然是Java的笔记,但无奈和C++的相似之处太多,还是很有启发的。
Update:貌似前面有些问题,今天在测试的时候,C++并不支持这种方式,编译器并不会自己识别,这么调用只会显示报错。不过,可以用另外一种方式来实现这一想法。
#include <iostream>
#include <string>
using namespace std;
class Person
{
public :
int age;
Person()
{
age=10;
}
virtual void say()//注意这个虚函数!!!
{
cout<<"i m person"<<endl;
}
};
class Student:public Person
{
public :
int age;
Student()
{
age=20;
}
void say()
{
cout<<"i'm student"<<age<<endl;
}
};
void check(Person *man)//定义一个指向父类的对象指针
{
man->say();
}
int main()
{
Student man;
check(&man);//将子类的地址赋给指向父类的对象指针
return 0;
}
通过虚函数,程序将会调用子类的say()函数,注意一定要将其设为虚函数,否则还是会调用父类本身的say()函数,这一点可以去详细看下虚函数的用法。