C++虚函数:
1、实现多态(方法重写)
当使用基类的指针指向派生类的实例调用重写的虚函数时,指向父类就调用父类的虚函数,指向子类则调用子类的虚函数,这种现象叫做多态
2、在基类的析构函数中使用virtual ,当用一个基类的指针删除一个派生类的对象时,派生类的析构函数会被调用。(声明为父类,具体为子类,此时子类的析构函数被调用,子类的空间才真正的释放,防止内存泄漏)
3、基类的析构函数应该写为虚函数,并在虚函数表中存储(多占一定的内存空间)。不会被继承的类的析构函数不要写成虚函数,不然就是浪费存储空间。
多态的实现主要分为静态多态和动态多态,静态多态主要是重载,在编译的时候就已经确定;动态多态是用虚函数机制实现的,在运行期间动态绑定。举个例子:一个父类类型的指针指向一个子类对象时候,使用父类的指针去调用子类中重写了的父类中的虚函数的时候,会调用子类重写过后的函数,在父类中声明为加了virtual关键字的函数,在子类中重写时候不需要加virtual也是虚函数。
虚函数的实现:在有虚函数的类中,类的最开始部分是一个虚函数表的指针,这个指针指向一个虚函数表,表中放了虚函数的地址,实际的虚函数在代码段(.text)中。当子类继承了父类的时候也会继承其虚函数表,当子类重写父类中虚函数时候,会将其继承到的虚函数表中的地址替换为重新写的函数地址。使用了虚函数,会增加访问内存开销,降低效率。
二、函数重写(也称为覆盖, Function override)
1、什么是函数重写
函数重写分为 虚函数重写(会发生多态) 与 非虚函数重写(重定义的一种形式);
函数重写:也叫做覆盖。子类重新定义父类中有相同返回值、名称和参数的虚函数。函数特征相同。但是具体实现不同,主要是在继承关系中出现的 。
注:一般而言,函数重写 就是 虚函数重写,为的是实现多态调用;
2、函数重写的条件
1. 函数的返回类型、方法名、参数列表完全相同;
2. 必须发生在不同的作用域中(基类与派生类中);
3. 基类中有 virtual 关键字声明,派生类中可有可无,不能有 static (虚函数重写);
3、函数重写的意义
在面向对象的继承关系中,我们了解到子类可以拥有父类中的所有属性与行为;但是,有时父类中提供的方法并不能满足现有的需求,所以,我们必须在子类中重写父类中已有的方法,来满足当前的需求。
虚函数表:
C++中,一个类若存在虚函数,那么编译器就会为这个类生成一个虚函数表,在虚函数表里存放的是这个类所有虚函数的地址。
当生成类对象的时候,编译器会自动的将类对象的前四个字节设置为虚表的地址,而这四个字节就可以看作是一个指向虚函数表的指针。
虚函数表可以看做一个函数指针数组。
https://blog.csdn.net/qq_37934101/article/details/81365449