C/C++ 静态多态与动态多态

  静态多态就是在系统编译期间就可以确定程序执行到这里将要执行哪个函数,比如函数的重载。

  动态多态则是利用虚函数实现了运行时的多态,也就是说在系统编译的时候并不知道程序将要调用哪一个函数,只有在运行到这里的时候才能确定接下来会跳转到哪一个函数的栈帧。

  虚函数就是在基类中声明该函数是虚拟的(在函数之前加virtual关键字),然后在子类中正式的定义(子类中的该函数的函数名,返回值,函数参数个数,参数类型,全都与基类的所声明的虚函数相同,此时才能称为重写,才符合虚函数,否则就是函数的重载),再定义一个指向基类对象的指针,然后使该指针指向由该基类派生的子类对象,再然后用这个指针来调用改虚函数,就能实现动态多态。

  函数名称相同情况下:

  重载(作用域相同,参数个数或顺序或类型不同,无论是否虚函数)。本质上是不同函数。

  覆盖(或称重写,作用域不同,参数个数顺序类型相同,必须是虚函数)。本质是在继承时替换虚函数表对应的函数地址。

  隐藏(作用域不同,参数无论是否相同,无论是否虚函数)。发生在从父作用域进入子作用域时。

  结论,作用域相同必须是重载否则重定义,作用域不同时如果参数相同且是虚函数则为覆盖否则为隐藏。

  对于重载:

  const type与type不构成重载

  const type&与type&构成重载

  const type*与type*构成重载

猜你喜欢

转载自www.cnblogs.com/dailycode/p/9595696.html