C++ 中多继承情况下 如何确定某个类型的方法,在虚函数表中的位置?

OSReact 2015-04-16 06:15:02
class
InterfaceU1
{
public:
virtual void func1() = 0;
}

class
InterfaceU2
{
public:
virtual void func2() = 0;
}

class
Wrapper
{
public:
virtual InterfaceU1* getInterface1() = 0;
virtual InterfaceU2* getInterface2() = 0;
}

class
Base : public Wrapper, public InterfaceU1, public InterfaceU2
{
public:
virtual InterfaceU1* getInterface1()
{
return this;
}
virtual InterfaceU2* getInterface2()
{

return this;
}
virtual void func1()
{
printf("%s", "func1");
}

virtual void func2()
{
printf("%s", "func2");
}
}

假设有如下代码:

Base* pBase = new Base();
pBase->getInterface1()->func1();

其实以上代码等于:

Base* pBase = new Base();
InterfaceU1* pInterface1 = pBase->getInterface1();
pInterface1->func1();



C++编译后,Base类的虚函数表如下:
 
vTable:Wrapper |Base::getInterface1()|Base::getInterface2()|Base::func1()|Base::func2()|
vTable:InterfaceU1 |Base::func1()|
vTable:InterfaceU2 |Base::func2()|


如果单继承情况下 ((InterfaceU1*) pObj)->func1() 很好理解,只需要pObj的vptr[0]处的函数地址即可。
但是多继承情况下,返回的指针pObj 如果用 ((InterfaceU1*) pObj)->func1() 如果依旧使用vptr[0] 则完全错误。
C++是如何得到当前应该使用vptr[??]位置的函数地址呢?
C++会动态的根据this的当前类型修改所用的是哪张虚表吗?(或者说,存在这种动态的判断吗。编译器是否无法确定)
...全文
341 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
OSReact 2015-04-17
  • 打赏
  • 举报
回复
因为有一个库 它的api接口全都是类做参数。我想跨语言调用,所以需要在内存中自己构造一张虚表。初步调用均都成功了,但是有一些东西多继承更方便一点 所以想参考一下怎么处理这个东西。
baidu_15173959 2015-04-16
  • 打赏
  • 举报
回复
怎么感觉你是想拿这个问多太的问题,可是这个又不是! 多太的话有产生虚表,来存放成员函数,在访问的过程中,子类会先把父类中的成员继承过来,然后把指向和父类中虚函数重名并同类型的函数的指针指向,子类的那个函数!指针地址没有变,只是指向的虚表位置变了!
taodm 2015-04-16
  • 打赏
  • 举报
回复
知道了这个,对你实际编程有什么指导意义吗?
iyomumx 2015-04-16
  • 打赏
  • 举报
回复
设有代码
    Base* pBase = new Base();
    pBase->getInterface1()->func1();
    
    InterfaceU1* pIf = ((InterfaceU1*)pBase);
你可以尝试用printf("%p %p", pBase, pIf);打印出它们的实际值,在大部分编译器的实现下,两个值不同 所以下次在C++里做这类转换时,请用static_cast<InterfaceU1*>来提醒自己,地址已经发生改变了
OSReact 2015-04-16
  • 打赏
  • 举报
回复
为什么木有人。求大神指点。

65,182

社区成员

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

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