c++手动用指针调用虚表中的函数

1。调用基类中的函数.用一个指针保存基类的地址然后。使他指向虚表。再强转成函数指针。
2.调用子类中的函数。用一个基类指针保存子类地址。然后和 1一样。


#include<iostream>
using namespace std;
class bass {
public:
    virtual void fun() {
        cout << "bass" << endl;
    }
};
class sun :public bass {
public:
    void fun() {
        cout << "sun" << endl;
    }
};
int main()
{
    bass bass1;
    bass1.fun();
    sun sun1;
    sun1.fun();
    bass* pbass;
    pbass = &sun1;
    pbass->fun();
    //void(*p)();
    cout << sizeof(bass) << endl;

    int* add1 = (int*)&bass1;//指向对象bass1的指针
    int* add2 = (int*)*add1;//指向虚函数表的指针
    (*(void(*)())(*add2))();//强转函数指针(函数与类型与虚函数类型一致)

    int* add3 = (int*)pbass;//基类指针指向子类 pbass=&sun1;
    int* add4 = (int*)*add3;//指向虚函数表的指针
    (*(void(*)())(*add4))();
    cout << hex << ((int*)(*((int*)&sun1))) << endl;//虚表中第一个函数地址也就是基类的函数地址
    cout << hex << ((int*)(*((int*)&sun1)) + 1) << endl;//虚表中第二个函数地址也就是子类的函数地址
    cin.get();

}

这里用的是 vs2017 版 同时在 xcode9 中编译通过运行出错。同时只要是类型之间转换。会非常严格。

原文地址:http://blog.51cto.com/haidragon/2070770

时间: 2024-11-06 03:33:24

c++手动用指针调用虚表中的函数的相关文章

在C++中调用DLL中的函数(2)

转自:http://blog.sina.com.cn/s/blog_53004b4901009h3b.html 应用程序使用DLL可以采用两种方式: 一种是隐式链接,另一种是显式链接.在使用DLL之前首先要知道DLL中函数的结构信息. Visual C++6.0在VC\bin目录下提供了一个名为Dumpbin.exe的小程序,用它可以查看DLL文件中的函数结构.另外,Windows系统将遵循下面的搜索顺序来定位DLL: 1.包含EXE文件的目录, 2.进程的当前工作目录, 3.Windows系统

在VS2012中采用C++中调用DLL中的函数 (4)

这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3) 但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google“vs2012 c++调用dll”时,发现了一篇MSDN上的指南:http://msdn.microsoft.com/zh-cn/library/m

在C++中调用DLL中的函数 (3)

1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等,它们都以源代码的形式发布.由于这种复用是“源码级别”的,源代码完全暴露给了程序员,因而称之为“白盒复用”.“白盒复用”的缺点比较多,总结起来有4点. 暴露了源代码:多份拷贝,造成存储浪费: 容易与程序员的“普通”代码发生命名冲突: 更新功能模块比较困难,不利于问题的模块化实现: 实际上,以上4点概

在C++中调用DLL中的函数

1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等,它们都以源代码的形式发布.由于这种复用是"源码级别"的,源代码完全暴露给了程序员,因而称之为"白盒复用"."白盒复用"的缺点比较多,总结起来有4点. 暴露了源代码:多份拷贝,造成存储浪费: 容易与程序员的"普通"代码发生命名冲突

使用shell调用python中的函数

最近遇到一个需求,需要通过shell调用python中的一个函数,发现其实也挺简单的: python脚本如下: test.py: import ConfigParser config = ConfigParser.ConfigParser() config.read("test.conf") def get_foo(): return config.get("locations", "foo") def get_bar(): return con

在VS2012中采用C++中调用DLL中的函数(4)

转自:http://www.cnblogs.com/woshitianma/p/3683495.html 这两天因为需要用到VS2012来生成一个DLL代码,但是之前并没有用过DLL相关的内容,从昨天开始尝试调试DLL的文件调用,起初笔者在网络上找到了3片采用VSXXX版本进行调试的例子,相关的内容见本人Blog在C++中调用DLL中的函数(1)(2)(3) 但是问题出现了,上面讲述的步骤很详细但是在自己运行的时候却会出现错误,于是今天在使用google"vs2012 c++调用dll"

在C++中调用DLL中的函数(3)

转自:http://www.cnblogs.com/woshitianma/p/3681745.html 1.dll的优点 代码复用是提高软件开发效率的重要途径.一般而言,只要某部分代码具有通用性,就可将它构造成相对独立的功能模块并在之后的项目中重复使用.比较常见的例子是各种应用程序框架,ATL.MFC等,它们都以源代码的形式发布.由于这种复用是"源码级别"的,源代码完全暴露给了程序员,因而称之为"白盒复用"."白盒复用"的缺点比较多,总结起来有

C++虚函数:虚指针、虚表、虚函数入口地址

测试程序: //test.c #include"stdio.h" #include"string.h" class GSVirtual { public: void gsv(char *src) { char buf[200]; strcpy(buf,src); vir2(); } virtual void vir1() { printf("vir1"); } virtual void vir2() { printf("vir2&quo

网页开发中调用iframe中的函数或者是dom元素

iframe中的代码 <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>By DragonDean</title> <script&g