关于虚函数看这里
虚函数的作用
虚函数的作用主要是实现了多态的机制,所谓多态,
就是一个基类指针或引用指向一个派生类实例,
然后通过基类指针调用派生类函数,达到一个用不同的代码实现不同的算法的目的。
虚函数表
有虚函数的类都有一个虚函数表指针,这个指针指向一个虚函数表,
虚函数表里有类的虚函数地址,这张表解决了继承,覆盖的问题。
没有虚函数重写的继承
没有虚函数重写就不会发生覆盖问题,
派生类直接继承基类的虚函数表。
有虚函数重写的继承
派生类继承的虚函数表只是一份拷贝,
对他进行改变不会影响基类的虚函数表,
如果派生类重写了基类的虚函数,
那么派生类中重写的函数地址会覆盖虚函数表中被重写函数的地址。
没有虚函数重写的多重继承
所谓的多重继承就是一个派生类继承多个基类,
这时派生类中会依继承顺序排放各自的虚函数指针,
而派生类的成员函数(虚函数)会放在第一个虚函数表中。
有虚函数重写的多重继承
如果有重写的虚函数,那么重写的函数地址会覆盖所有虚函数表中同名虚函数地址。
下图中,我们在子类中覆盖了父类的f()函数。
下面是对于子类实例中的虚函数表的图:
我们可以看见,三个父类虚函数表中的f()的位置被替换成了子类的函数指针。这样,我们就可以任一静态类型的父类来指向子类,并调用子类的f()了。如:
Derive d;
Base1 *b1 = &d;
Base2 *b2 = &d;
Base3 *b3 = &d;
b1->f(); //Derive::f()
b2->f(); //Derive::f()
b3->f(); //Derive::f()
b1->g(); //Base1::g()
b2->g(); //Base2::g()
b3->g(); //Base3::g()