首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >每个对象中都会复制C++ vptr

每个对象中都会复制C++ vptr
EN

Stack Overflow用户
提问于 2013-05-23 18:58:06
回答 5查看 454关注 0票数 2

在c++中,我们在每个对象中都有VPTR,但每个类只有一个VTABLE。为什么VPTR存在于每个对象中?它不是重复的吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-23 19:02:02

没有运行时类型信息,您就不知道对象在哪个类中。因此,为了调用方法,您需要存储类信息,然后使用它来查找要调用的正确vtable。只需在每个对象中放置一个指针就更容易(也更直接)。

票数 3
EN

Stack Overflow用户

发布于 2013-05-23 19:06:37

如果您有:

代码语言:javascript
复制
class base
{
   virtual void func() = 0; 
}

class a: public base
{
 public:
   virtual void func() { cout << "a" << endl; }
}

class b: public  base
{
 public:
   virtual void func() { cout << "b" << endl; }
}


void call_func(base *x)
{
    x->func();
}

int main()
{
    vector<base *> v;

    v.push_back(new b);
    v.push_back(new a);

    for(int i = 0; i < v.size(); i++)
        call_func(v[i]);
}

"call_func“如何知道调用哪个func

结果是它使用vtable (vptr)来查找要调用的func

是的,代码是一个巨大的内存泄漏--我尽量保持简单

票数 4
EN

Stack Overflow用户

发布于 2013-05-23 18:59:30

内存中C++对象的实例如何引用它的VTABLE?然而,VPTR-VTABLE是编译器特定的实现,C++标准没有对它做任何说明。通常,它是多态类实例的第一个(隐藏)成员。

这是有代价的,因为拥有这样的隐藏成员使得C++内存模型与C不兼容。这是一个开销,同意,但没有其他(更好的)方法从内存中的C++对象的实例引用VTABLE。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16712157

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档