这两个问题是同一个。
多态的实现就是虚函数的实现原理。虚函数的实现就是为了多态。
虚函数作用
允许在派生类中重新定义与基类同名函数,并且可以通过基类指针或引用来访问基类或派生类同名函数
实现原理
每一个含有虚函数(无论是其本身的,还是继承而来的)的类都至少有一个与之对应的虚函数表(多继承有多个。同时第一个为主基类),其中存放着该类所有的虚函数对应的函数指针。
有虚函数的类内部有一个称为“虚表”的指针,指向该表。
如果类没有重写虚函数,那么直接拷贝继承来的虚函数到虚函数表中。
如果类重写了虚函数,需要在虚函数表中覆盖对应的虚函数。
同名虚函数在虚函数表中的偏移量相同。(如果类是个多继承,且都有虚函数,那么他就有多个虚函数表指针,为了使偏移量相等。)
调用过程
在编译器,无法获得具体的类型是什么。但是能够获得其调用函数的虚函数表,和在表中的偏移量。
在运行时,能够获得具体的类型,获得其虚函数表指针,然后指针加上偏移量,就能够获得对应的函数。
多继承中,基类指针指向的是派生类中自己继承过去的部分。
虚函数的效率低其原因就是,在调用虚函数之前,还调用了获得虚函数地址的代码。
多态用处
复用和提高维护性
- 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
- 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用