所有派生类对象都可以看成是一个基类对象。
如:生活知识告诉我们,动物类包括猫类,狗类等,一只狗是狗类的一个对象也是动物类的 一个对象,类似的,一只猫是猫类的一个对象也是动物类的 一个对象。
多态技术可以看成是一种区分各个派生类对象某种方法的机制,这种机制在c++中通过虚函数实现。
如:动物类有“叫”的一个方法。类似的,其派生类对象猫和狗也就叫的方法,但是猫和狗的叫声是不一样的,通过多态技术就可以 区分这一点,等下会说明实现的机制。
向上映射:
1、通过类继承的学习,我们知道,一个派生类的地址可以赋给基类类型的指针。
2、这种取一个对象的地址,并看成是基类的地址,就称为是向上映射。
绑定:
1、把函数体与函数调用相联系称为捆绑。
2、绑定分为早绑定和晚绑定两种。
--早绑定在程序运行之前绑定
--晚绑定在程序运行时绑定
3、要实现晚绑定,需要一种机制,该机制可以再运行时确定对象的类型和找到合适的调用函数。
虚函数:
c++通过虚函数来实现晚绑定,在c++中晚绑定只对虚函数有作用,并只发生在我们使用一个基类的地址时,此基类有虚函数。
如果一个函数在基类中定义为virtual,那么在他的所有派生类都是virtual。
c++实现晚捆绑:
1、编译器对每个包含虚函数的类创建一个表VTABLE,在该表中编译器放置特定类的虚函数地址。
2、每个带有虚函数的类对象中,有一个指向这个对象的VTABLE的指针。
3、在VTABLE中放置虚函数的代码(如果相应的虚函数在继承类中作了修改,那么函数的实现为修改后的函数,如果未修改,那么函 数的实现为基类的函数实现)。
4、以基类的指针执行派生类对象。
--首先基类指针会找到VTABLE指针,接着找到相应的函数执行。应为不同的派生类对基类的虚函数做了相应的修改,所以VTABLE中的函数一般为和相应派生类的函数。继而执行的也是派生类的虚函数,这样就能根据VTABLE执行不同的操作,实现多态。
待续...