• 反汇编:虚函数表


    多态中virtual的工作原理

    正常实现多态的代码

    #include "stdafx.h"
    
    class Base{
    public:
    	virtual HowVirtual(){
    		printf("the Base virtual");
    	}
    };
    
    class Son:public Base{
    public:
    	virtual HowVirtual(){
    		printf("the Son virtual");
    	}
    };
    
    void theVir(Base& fath){
    	fath.HowVirtual();
    }
    
    
    int main(int argc, char* argv[])
    {
    
    	Base b;
    	Son s;
    	//theVir(s);
    	//theVir(b);
    	
    	printf("
    ");
    	return 0;
    }
    

    问题:为什么可以实现多态的功能?也就是相同方法下,编译器是如何判断传入的是哪个对象所以调用该对象实现的方法的?

    如下地方进行断点,然后进行运行,可以发现每个对象中都会存在一个__vfptr名称的一个指针,该指针指向一个地址为0x00422f9c0x0042210c,展开选项为如下:

    这里面最终的地址分别是指向的是004010190040102d,然后跟过去00401019发现是个跳转,如下:

    00401019 jmp Base::HowVirtual (0040d8c0)

    那么跟0040d8c0可以发现是Base::HowVirtal方法

    而子类的虚拟表中同样进行操作,发现结果是如下:

    0040102D jmp Son::HowVirtual (0040d950)

    那么大家就可以理解了,使用virtual的时候能够实现多态的功能!

    还需要注意的是

    1、虚表会在当前对象中占四个字节,因为它是一个地址

    2、当虚函数越多的时候,__vfptr地址中保存的值只是存储所有虚函数的首地址,比如现在定义了两个虚函数,如下:

    继续跟发现如下:虚函数是连续的!

  • 相关阅读:
    三种省市级联下拉列表的写法
    三种省市级联下拉列表的写法
    SQL经典试题(mysql)
    60行代码俄罗斯方块
    ibatis xml中配置信息详解
    60行代码俄罗斯方块
    xinetd
    csh and tcsh
    xinetd restart
    bash sh
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12346971.html
Copyright © 2020-2023  润新知