虚函数实现机制:
1、当类中存在虚函数里.则编译器会在编译期自动的给该类生成一个函数表,并在所有该类的对像中放入一个隐式变量vptr,该变量是一个指针变量,它的值指向那个类中的由编译器生成的虚函数表.
2、每个类自己的虚函数入口都在这张表中维护,调用方法的时候会隐式的传入一个this指针,然后系统会根据this指针找到对应的vptr,进而找到对应的虚函数表,找到真正方法的地址,然后才去调用这个方法,这可以叫动态绑定。
3、虚函数表存放重写的虚函数,当基类的指针指向派生类的对象时,调用虚函数时都会根据vptr来选择虚函数,而基类的虚函数在派生类里已经被改写或者说已经不存在了,所以也就只能调用派生类的虚函数版本了.
当调用pBase->show();时,执行的步骤:
1, 判断Base类中show是否为虚函数。
2, 若不是虚函数则找到pBase所指向的对象所属类Base。执行Base::show()。若是虚函数则执行步骤3.
3, 访问pBase所指对象的虚函数表指针得到pBase所指对象所在类的虚函数表。
4, 查找Base中show()在声明时的位序为x,到步骤3得到的虚函数表中找到位序x,从而得到要执行的show的函数地址。
5, 根据函数地址和Base中声明的show的函数类型(形参和返回值)访问地址所指向的函数。
从虚函数的实现机制可以看到要想在子类中实现多态需要满足三个重要的条件。
(1)在基类中函数声明为虚函数。
(2)在子类中,对基类的虚函数进行了重写。
(3)基类的指针指向了子类的对象。
网友评论