1.1虚函数的作用
🐵重复定义:在同一个类中定义两个名字相同,参数个数和类型相同的函数
注:如果类中出现,编译系统按照同名覆盖的选择决定调用顺序
虚函数:在基类声明函数为虚拟的,在派生类正式定义此函数,使用时用指针指向某一派生类对象
🐵作用:允许派生类中重新定义与基类同名的函数,可以通过基类指针或者引用访问基类和派生类中的同名函数,同一种方式调用不同类的所有同名函数
🙈方式:在基类中函数名前加
virtual
注:
基类指针是指向基类对象的,如果指向派生类对象,自动进行类型转换,将派生类对象的指针先转换成基类的,这样基类指针指向的是派生类中的基类部分,所以无法调用派生类的成员函数
🐒动态多态性:同一类族中不同类的对象,同一函数调用做出不同反应
🌸虚函数使用方法:
(1)在基类中用virtual声明成员函数为虚函数,类外定义不用加
(2)在派生类中重新定义该函数,函数名。函数类型,函数参数个数必须与基类的虚函数相同,根据派生类的需要重新定义新函数体,可以加virtual也可以不加virtual
(3)定义一个指向基类对象的指针变量,并指向同一类族中需要调用的对象
(4)通过指针变量调用虚函数
🎐注:如果派生类指针调用非虚
函数,并不是多态行为
1.3什么情况下应该声明为虚函数
注:
①只能声明类的成员函数,不能为普通函数,也不能是友元函数
②一个成员函数被声明为虚函数后在同一个类中不能定义一个非virtual但与该虚函数有相同的参数的同名函数
考虑:
①成员函数所在的类是否作为基类,派生类中的函数功能是否要改变
②如果被继承后功能无需改变,或者派生类用不到,不用
③如果对成员函数调用是通过指针或者引用实现的
④有时候,虚函数在基类中的函数体是空的,具体功能留给派生类添加
1.4虚虚析构函数
如果建立new临时对象,如果基类有析构函数,并且定义一个指向基类的指针变量,用delete撤销时,会发生
只执行基类的虚构函数不执行派生类的析构函数
🌸将基类的析构函数声明为析构函数
注:派生类的所有析构函数都会自动为虚函数,即使名字不同
❗❗❗构造函数不可以被声明为虚函数,因为在执行构造函数时类对象还未完成建立过程,自然谈不上……
1.4纯虚函数
🙊纯虚函数
在基类中不需要该函数,返回值没有意义,不用写函数体,只给函数的原型,并加上0
virtual float are() const=0
🌸声明方式
virtual 函数类型函数名(参数列表)=0
注
①纯虚函数没有函数体
②最后面的“=0”并不表示函数返回值为0它只是形式上的
③是声明语句,后面有分号
如果一个类中声明了纯虚函数,但是没有定义,则在派生类中仍然为纯虚函数
1.4.2抽象类
🐵不用来生成对象,作用只是用它作为基类去建立派生类(抽象基类,凡是包含纯虚函数的,为类族提供一个接
口)
注:
①抽象基类和普通基类不一样,并不是现实存在的,没有任何物理意义
②类的层次结构中,最上面几层可以是抽象函数
③抽象基类是本类族的公共接口
④区别动态关联和静态关联⑤虚函数提高了程序的可扩充性