VTable内存布局的问题

nicklisir 2017-12-10 03:37:08
以下是一些导出类[该库的作用定义好呈现的形式,只让用户定义自己的行为(挂接)从而实现多样化]
Ibase0
{
//很多接口
};
//库基类(实现了Ibase0所定义地所有方法,隐藏在库中不导出)
CXXXroot:public Ibase0

//实现了所有办法
};
//导出类,继承CXXXroot,并新增许多特性(接口)
目前的办法:
【导出处理】
Iexport:public Ibase0
{
//新增接口定义
};
【内部实现】
CExpXXX:public CXXXroot

};
该方法的缺点是定义顺序要和接口定义一致,否则导致vtable访问出错。
各位有没有好的办法?多谢
...全文
206 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-12-11
  • 打赏
  • 举报
回复
《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
nicklisir 2017-12-10
  • 打赏
  • 举报
回复
IexportXXX是某库导出接口类 ,CExpXXX是IexportXXX的某库实现类,root是某库实例;createXXX是保露给使用者地接口,用来产生内部实现类(暂且认为为类实例工厂吧) IexportXXX *p5=(IexportXXX*)root->createXXX(......省略参数) 以下利用IexportXXX实例干点事。。。。。
sdghchj 2017-12-10
  • 打赏
  • 举报
回复
完全不知道你在表达什么。 编译器会自动处理虚函数到VTable,不用你去关心什么顺序问题。 并没看出你想用Iexport干什么。
nicklisir 2017-12-10
  • 打赏
  • 举报
回复
恩。但是这里稍有些不同,导出的和实现有些不同,只是布局结构相同而已?导出是派生于接口;实现是派生于接口的实现类;实现是在库中,使用是在引用它的客户端;我调整过位置,发现访问出错,我的猜想(强制将CXXXX转化为IXXXX,CXXX没有直接派生,当他们架构一样就没有问题)
www_adintr_com 2017-12-10
  • 打赏
  • 举报
回复
C++ 没有要求实现的方法定义顺序与接口的顺序一致的说法, 只要你将派生类的指针转换成了接口指针, 这个指针指向对象的虚函数表必定与接口中定义的顺序一致

65,187

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧