我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:六合图库 > 多态逻辑 >

函数重载与多态的实现本质区别是什么?

归档日期:06-11       文本归类:多态逻辑      文章编辑:爱尚语录

  其实,重载的概念并不属于“面向对象编程”,重载的实现是:编译器根据函数不同的参数表,对同名函数的名称做修饰,然后这些同名函数就成了不同的函数(至少对于编译器来说是这样的)。如,有两个同名函数:functionfunc(p:integer):integer;和functionfunc(p:string):integer;。那么编译器做过修饰后的函数名称可能是这样的:int_func、str_func。对于这两个函数的调用,在编译器间就已经确定了,是静态的(记住:是静态)。也就是说,它们的地址在编译期就绑定了(早绑定),因此,重载和多态无关!

  真正和多态相关的是“覆盖”。当子类重新定义了父类的虚函数后,父类指针根据赋给它的不同的子类指针,动态(记住:是动态!)的调用属于子类的该函数,这样的函数调用在编译期间是无法确定的(调用的子类的虚函数的地址无法给出)。因此,这样的函数地址是在运行期绑定的(晚邦定)。

  [b][color=#FF0000] 【黑马程序员】视频培训教材免费拿。 需要培训视频下载链接的留邮箱![/color][/b]

  [b]【黑马程序员】视频培训教材免费拿。需要黑马培训视频下载链接,留邮箱[/b]

  散分-java-小菜鸟-去做任务吧,【黑马程序员】视频培训教材免费拿。

  对象在构造的时候,先构造基类,在构造基类的过程中,如果基类中存在虚函数,则产生虚函数表(如果基类中没有定义虚函数是不会有虚函数表的),基类对象构造完成后;再构造派生类,如果存在虚函数,那么再次改写已经存在的虚函数表,并把派生类的虚函数的地址写到虚函数表中,这样以来,当调用到虚函数表时,找到的是派生类的函数所在地址,所以调用的也就是派生类的虚函数了,从实现了多态;也正是因为如此,在基类的构造函数中去调用虚函数,根据编译器的不同,会产生不可预料的效果:如没有办法调用派生类的虚函数

本文链接:http://lcvam.com/duotailuoji/546.html