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++类方法地址调用类的虚方法相关推荐

  1. SV 类的虚方法 多态

    SV 类的虚方法 多态 类型转换 概述 概述 类的成员方法可以加修饰词virtual(虚方法) 虚方法是一种基本的多态结构 一个虚方法可以覆盖基类的同名方法 在父类和子类中声明虚方法,其方法名.参数名 ...

  2. Java/Android 调用类里面的方法

    调用类里面的方法 一般都是new 调用的类然后就可以直接调用类里面的方法了 下面写一个类和调用 public class LaneInfo {public LaneInfo() {}public vo ...

  3. kotlin调用类中的方法_一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用

    kotlin调用类中的方法 by Oleksii Fedorov 通过Oleksii Fedorov 一种轻松的方法来测试Kotlin中令人沮丧的静态方法调用 (A stress-free way t ...

  4. LindAgile~缓存拦截器支持类的虚方法了

    写它的原因 之前写过一个缓存拦截器,主要在方法上添加CachingAspect特性之后,它的返回值就可以被缓存下来,下次访问时直接从缓存中返回结果,而它有一个前提,就是你的方法需要是一个接口方法,缓存 ...

  5. 利用Java反射机制调用类的私有方法

    利用Java反射机制调用类的私有方法 引言 来吧·展示 参考链接 引言 如何调用其他类的私有方法呢? 可以利用Java的反射机制,去调用其他类的私有方法 来吧·展示 package cn.learn. ...

  6. 反射_通过反射调用类中指定方法、属性

    一.调用指定方法 通过反射,调用类中的方法,通过Method类完成.步骤: 1.通过Class类的getMethod(String name,Class.......parameterTypes)方法 ...

  7. c++主函数中调用类内函数的方法

    c++主函数中调用类内函数的方法 以基数排序为例: #include <iostream> #include <vector> using namespace std;//基数 ...

  8. php怎么调用类里面的方法_php调用类中的方法

    PHP外文名:PHP: Hypertext Preprocessor,中文名:超文本预处理器是一种通用开源脚本语言.可以是未实例化的类名直接调用.下面由小编整理了几种php调用类中的方法,希望对大家有 ...

  9. php的call_user_func函数实现调用类中的方法

    php的call_user_func函数实现调用类中的方法 解决方法: call_user_func(array($classname,'doindex')); 例子:http://www.yayi​ ...

最新文章

  1. 视频jourk--hadoop2.2.0(第一个2.x的正式版本)框架介绍:笔记
  2. python文件输出中文_python文件输出
  3. linux系统下vim可以不用鼠标,真的有(很多)linux大牛用vim写项目吗?
  4. Servlet之javaweb应用(二)
  5. react 使用 leaflet 百度地图_【React】react项目中应用百度地图添加起始点绘制路线...
  6. 服务器实际显示内存,服务器实际显示内存
  7. PAT1124:Raffle for Weibo Followers
  8. 从jsp向servlet传送数据的两种方式
  9. 学习记录:由技术而产品,由产品而商务
  10. 西门子atch指令详解_西门子plc指令详解
  11. MySQL~高级应用 + 优化。
  12. DFS(深度优先搜索算法)
  13. 电商项目day16(购物车实现)
  14. Linphone SDK 最新版移植 iOS版
  15. ios修改根视图控制器
  16. 户外运动品牌的PLM 冒险!PLM软件转型升级常见问题
  17. Leetcode1091_二进制矩阵中的最短路径(Java+BFS解法)
  18. 蛋糕上两只翘着二郎腿的小胖猪可爱极了
  19. jmeter压力测试动态修改并发参数
  20. Windows找不到文件‘gpedit.msc‘。请确定文件名是否正确后,再试一次。

热门文章

  1. 【云原生工具集】洋气·给程序自定义启动图案
  2. ceph客户端使用_CEPH应用
  3. 提升技术团队战斗力的几件事
  4. 制药企业计算机系统urs,制药设备urs.pdf
  5. 【Maven】Archetype
  6. mysql big tables_mysql常见命令操作
  7. 控制Canon相机进行拍照,并把拍摄的照片存储到D盘
  8. Scikit-learn学习系列 | 4. sklearn特征降维方法汇总(方差过滤,卡方,F过滤,互信息,嵌入法)
  9. 推荐一个学习Linux命令的网站
  10. 计算机专业毕业生找工作可考虑的公司官方招聘网站(持续更新ing...)