重新开始学习C++
动态联编&&静态联编
class Human
{
public:
void beat(){}
};
class Man:public Human
{
public:
void beat(){}
};
class Woman:public Human
{
public:
void beat(){}
};
void main()
{
Human h;
Man m;
Woman w;
Human *pHuman = &h;
Human *pMan = &m;
Human *pWoman = &w;
pHuman->beat();
pMan->beat();
pWoman->beat();
}
将一个调用函数者联结上正确的被调用函数,这一过程叫做函数联编,一般简称为联编。
C++的联编共分为两种,就是静态联编和动态联编。
未加virtual说明时,该函数是静态联编,即被调用函数和函数调用者的关系以及它们的内存地址在编译时就已经确立好,运行时不再发生变化。这样的好处是速度快,因为运行的时候不用对各个对象的函数进行追踪,只需要传递参数,执行确定好的函数并在函数调用完毕后清理内存即可。
未说明为虚函数的函数,该函数在执行时将采用静态联编,即不对各个对象的 重载的 函数 进行追踪,这导致C++编译器在编译时认定的指向基类的三个指针pHuman、pMan、pWoman在运行时也不会根据对象的改变而改变。因此就算是将三个对象的内存地址一次赋给了三个指针,三个指针还是默认指向基类。
动态联编就要牺牲一些速度,因为每个调用函数运行前是不可确立的,要随着用户的操作来执行相应的函数。比如说在拳击游戏中用户按下一个出拳键。那么系统将根据用户选择的角色不同而采用不同的出拳(函数),虽然出拳(函数)名字是相同的,但是它们产生的效果不同,有的拳手力量大,速度小,有的拳手力量小,速度大(不同类的函数的功能不同)。这个函数调用是不可测的,因为你事先无法预料到用户选择的是哪个角色,这就要代码对每个角色进行跟踪,并且在游戏运行时要时刻地判断应该调用到哪个角色的出拳(合适的函数)。然后再调用它,虽然这样比较灵活,但是相应地会大大地增加系统的开销,在游戏中使用动态联编是个非常好的选择。