微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么虚拟方法表的大小大于虚拟方法的数量?

如何解决为什么虚拟方法表的大小大于虚拟方法的数量?

#include <iostream>

using std::cout;
using std::endl;

class ObjectA {
public:
    ObjectA(int x):value_(x) {}
    virtual void funcA()
    {cout << "ObjectA funcA" << endl;}
    virtual void funcA1()
    {cout << "ObjectA funcA1" << endl;}
private:
    int value_;
};

void printVirtualTable(ObjectA* objA)
{
    typedef void (*funcPtr)();

    funcPtr* vptr = (funcPtr*)(*((uint64_t*)objA));

    while (*vptr) {
        fprintf(stdout,"%p ",*vptr);
        vptr++;
    }
}

int main()
{
    ObjectA* objA = new ObjectA(19);
    printVirtualTable(objA);
    return 0;
}

ObjectA 有 2 个虚方法,所以我认为 vtable 的大小是 2,但是 printVirtualTable 显示 vtable 中有 3 个指针,第一个和第二个指针是 funcAfuncA1,但第三个是什么?

解决方法

我认为您需要将评估条件从 while(vptr) 更改为 while(*vptr)vptr 本身不会为空。

另外,如果你真的调用这些函数,你会看到在第三次调用时程序会崩溃。

这并不意味着您可以依赖此机制。它只是为了回答您的问题 - 第三个指针中没有任何内容。

      void printVirtualTable(ObjectA* objA)
  {
     typedef void(*funcPtr)();

     funcPtr* vptr = (funcPtr*)(*((unsigned int*)objA));

     if (*vptr) {
        (*vptr)();
        fprintf(stdout,"adddress vtable: %p direct address: %p\n",vptr,&objA);
     }
     vptr++;
     if (*vptr) {
        (*vptr)();
        fprintf(stdout,&ObjectA::funcA);
     }
     vptr++;
     if (*vptr) {
        (*vptr)();
        fprintf(stdout,&ObjectA::funcA1);
     }
  }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。