通过C++类方法地址调用类的虚方法
来源:互联网 发布:网页怎么看淘宝直播间 编辑:程序博客网 时间:2024/05/22 09:40
1. 类的定义,编译成动态链接库。
Canvas.h
#ifndef CANVAS_H#define CANVAS_Hclass Canvas{public: Canvas(); virtual ~Canvas(); virtual void draw(); virtual void round(int angle); void view();private: int m_value;};#endif
Canvas.cpp
#include "Canvas.h"#include <iostream>using namespace std;Canvas::Canvas() : m_value(100){}Canvas::~Canvas(){}void Canvas::draw(){ cout<<"virutal Canvas::draw"<<endl;}void Canvas::round(int angle){ m_value += angle; cout<<"virtual Canvas::round m_value="<<m_value<<endl;}void Canvas::view(){ cout<<"Canvas::view"<<endl;}
编译成动态链接库的命令是:
g++ -fPIC -g -c Canvas.cpp
g++ -g -shared -Wl,-soname,libCanvas.so.1 -o libCanvas.so.1.0.1 Canvas.o -lstdc++
2. 用nm命令查看动态链接库的导出函数:
nm libCanvas.so.1.0.1
查看到Canvas::round导出的符号是:“_ZN6Canvas5roundEi”。
3. 那么可以像如下文件一样调用:
#include <iostream>#include <dlfcn.h>#include "canvas/Canvas.h"using namespace std;//typedef void (*canvas_round_func)(int);typedef void (*canvas_round_func)(Canvas* self, int); // 定义Canvas::round对应的函数指针。第一个参数指向类实例。int main(){ void* lib = dlopen("libCanvas.so", RTLD_LAZY); Canvas canvas; canvas.draw();// canvas.round(0); canvas.view(); canvas_round_func func = (canvas_round_func)dlsym(lib, "_ZN6Canvas5roundEi"); if (func) { cout<<"get function ok."<<endl; func(&canvas, 10); } else { cout<<"return null"<<endl; } dlclose(lib); return 0;}
编译:g++ -g -c main.cpp -o main.o
echo Compile ... Done.
g++ -g -o main.exe main.o -L. -lCanvas -ldl
echo Linking ... Done.
结果是可以正常运行的。
- 通过C++类方法地址调用类的虚方法
- 通过反射调用类内部的方法
- 通过反射调用类里面的方法
- c代码调用c++类的方法
- c代码调用c++类的方法
- 获取类成员函数地址和调用的方法
- Java通过JNI调用C语言的方法
- Java通过JNI调用C语言的方法
- Java通过JNI调用C语言的方法
- 反射2:获取类的方法(通过方法名调用方法),属性,声明
- 通过JAVA的反射调用类中的公有私有方法
- java通过反射调用类的private方法.
- java 通过反射获得类的属性和调用方法
- JNI: JAVA通过JNI调用另一个JAVA类的方法
- 通过反射机制调用某个类的方法
- Unity通过字符串“class”调用此类class的方法
- 如何通过反射来调用类方法
- 通过反射调用类中的方法
- CSV processing in Ruby
- Ubuntu下安装LAMP及phpmyadmin
- 微内核的QNX
- 【学习】WCF的服务契约、复杂类型序列化、消息契约的实现
- HDOJ Constructing Roads
- 通过C++类方法地址调用类的虚方法
- Ruby CSV - An example of how to split CSV row data into fields
- HDOJ Play on Words
- 分享Silverlight/WPF/Windows Phone一周学习导读(8月28日-9月3日)
- How to open and sort a CSV file with Ruby
- 简单的字符设备(1)
- 拦截器
- 算法导论学习1--分治法计算逆序数
- HDOJ Jungle Roads