C++基础之多态性与虚函数
1、多态定义:计算机在编译时或运行时,根据我们实际的代码自动调用不同的函数的能力为多态。
2、多态分类:(编译时)静态多态:前期绑定:a)函数重载
b)模板
(运行时)动态多态:(默认)后期绑定:根据指针的实际数据类型自动调用不同函数(功能)
3、动态多态实现原理:
1>子类继承了所有父类的产品
2> virtual === 基类添加了一个虚拟函数表
4、动态多态实现效果:如果子类重载虚函数,则调用自己的版本,否则调用父类函数版本。同一类族中不同类的对象,对同一函数调用作出不同的响应。5、虚函数的缺点:
1>多了堆区的(虚拟函数表)占内存
2>调用时多查找了虚拟函数表,性能低
3>虚函数只能够使用在实例函数上(static不行)
[注意:构造函数不能使用虚函数
析构函数可以声明为虚函数]6、虚拟函数表与类相关,一个类只有一个虚拟函数表,同一个类的多个对象调用同一个虚拟函数表(但每个对象都有一个虚拟函数表指针)
7、给基类函数加virtual(声明时),将子类对象地址赋给基类指针,则指针会根据实际子类函数不同调用对应的函数。【如果不加virtual,按照类的继承,则调用的是父类函数。--》( 在类的继承层次结构中, 在不同的层次中可以出现名字相同、参数个数和类型都相同而功能不同的函数。编译系统按照同名覆盖的原则决定调用的对象。)】
例子:
[Circle类继承Cshape,Cshape类中有一个成员变量penwidth,一个成员函数draw()]
基类:Cshape *p[3]; p[0]=&circle;
注意:
虚函数只能是类的成员函数。且一个函数被声明为虚函数后,在派生类中与此函数同名同参同返回值的函数一律为虚函数。