C++多态

C++多态表现形式主要有函数重载、运算符重载和虚函数等,其中函数重载、运算符重载是静态多态,虚函数是动态多态。也就是说,C++中运行时的多态性主要是通过虚函数重载来实现的。

1.静态多态

静态链编或早绑定:编译器在编译期间完成的,编译器根据函数实参的类型(可能会进行隐式类型转换),可推断出要调用哪个函数,如果有对应的函数就调用该函数,否则出现编译错误。

2.动态多态

动态链编或晚绑定:在程序执行期间(非编译期)判断所引用对象的实际类型,根据其实际类型调相应的方法。

使用virtual关键字修饰类的成员函数时,指明该函数为虚函数,派生类需要重新实现,编译器将实现动态绑定。

动态绑定的条件:(1)必须是虚函数(任何构造函数之外的非静态函数都可以是虚函数

                            (2)通过基类类型的引用或者指针调用函数

注意:如果派生类的函数与基类同名,但是参数不同,此时,不论有无virtual关键字,基类的函数将被隐藏。

         如果派生类的函数与基类同名,并且参数也相同,但是基类函数没有virtual关键字,此时,基类的函数将被隐藏。

        派生类重写了基类中的虚函数,则派生类对象的虚表会替换基类中的虚函数,即基类的虚函数被派生类重写的虚函数覆盖了。

        派生类先拷贝基类的虚表,若派生类没有重写虚函数,则虚表与基类的相同,若重写了虚函数,则派生类会将基类相同位置上的虚函数覆盖,再在虚表后面加上派生类自己的虚函数。(基类和派生类用的不是一张虚表)


阅读更多
个人分类: C++
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭