VTable内存布局的问题

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

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

};
该方法的缺点是定义顺序要和接口定义一致,否则导致vtable访问出错。
各位有没有好的办法?多谢
...全文
159 5 点赞 打赏 收藏 举报
写回复
5 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
赵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++ 没有要求实现的方法定义顺序与接口的顺序一致的说法, 只要你将派生类的指针转换成了接口指针, 这个指针指向对象的虚函数表必定与接口中定义的顺序一致
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2017-12-10 03:37
社区公告
暂无公告