多态:当函数声明为虚函数时,使用父类对象引用子类对象时,会调用子类中的函数,通过这种方法,还能够同时访问子类成员变量
- 函数所有的申明一定要相同
- 在重定义虚函数的情况下,在派生类中如果想要调用父类中的函数,可以使用
父类域名解析符::函数名 来调用父类函数
多态使用场景
如果定义了一个英雄父类,所有的人物都继承这个父类,那么,在写代码时,使用父类的指针就可以调用这些继承类的所有重定义函数
多态的对象模型
- 成员函数是静态的,不会存放在对象内存模型中,使用时,将this指针传给成员函数即可
- 有无虚函数对象内存模型对比,多了一个虚函数表指针
- 虚函数使用类名::虚函数名来表示
- 如果有没有虚函数时,编译时,会将成员函数地址直接链接到二进制文件中,如果有虚函数,则不会
- 如果调用普通成员函数,则直接传地址给成员函数。如果调用虚函数,则先查表,再调用
- 如果派生类重定义了虚函数,则会替代虚函数中的那一项,如图
- 如果没有重定义,则不会替代,调用的还是父类虚函数
- 如果子类自己重新定义一个虚函数,则会在虚函数表中追加一项
- 辅助理解的两张图
实现多态时,需要将父类的析构函数也设置问虚函数,以方便后续对其析构
父类内存模型
子类内存模型
定义为虚析构函数后,会将析构函数名改为{dtor}存入虚函数表中
(调用子类析构函数时,一定会调用一次父类析构函数)