C++ 多态与虚函数
这一篇介绍一下 C++ 面向对象三大特征之一的多态(之前面试某大厂的实习生被问到多态,后来又了解到一些设计模式,才体会到多态的强大,在这里把对多态的一点点浅显认识总结一下) 如有侵权,请联系删除,如有错误,欢迎大家指正,谢谢 多态 父类的一个指针,可以有多种执行状态(父类的指针调用子类的函数),即多态 多态实际上只是一种思想,而虚函数是实现这个思想的语法基础 虚函数 虚表 若对象有虚函数,对象空间最开始 4Byte(32Bit目标平台)或 8Byte(64bit目标平台)内容是虚表(虚函数列表)的首地址,叫虚指针 在实例化对象时,编译器检测到虚函数(virtual修饰的成员函数)时,会将虚函数的地址放到虚表(类似于一个存放函数指针的数组)中 当实例化子类时,检测到有虚函数的重写,编译器会用子类重写的虚函数地址覆盖掉之前父类的虚函数地址,当调用虚函数时,检测到函数是虚函数就会从虚表中找对应的位置调用,若子类没有重写,虚表中的虚函数地址就还是父类的,若子类中有重写,虚表记录的就是子类重写的虚函数地址,即实现了父类的指针调用子类的函数 虚表中先记录父类中的虚函数地址,接着记录子类中虚函数地址(若子类重写父类的虚函数则是覆盖) 最后虚表还有一个尾值是 0 class Test { public : virtual void vfunc ( ) { cout << "Test virtual