2

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

4

5 回答 5

4

如果你有:

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要调用的对象。

[是的,代码是一个巨大的内存泄漏 - 我试图保持简单]

于 2013-05-23T11:06:37.100 回答
3

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

它带来了成本,因为拥有这样的隐藏成员会使 C++ 内存模型与 C 不兼容。这是一种开销,同意,但没有其他(更好的)方法可以从内存中的 C++ 对象实例引用 VTABLE。

于 2013-05-23T10:59:29.997 回答
3

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

于 2013-05-23T11:02:02.180 回答
3

首先,标准无法保证这一切,您需要讨论特定的编译器才能获得特定的答案。

动态绑定适用于对象级别。一个类永远不会被多态地使用,一个对象是。因此,您需要弄清楚某个函数是如何在每个对象的基础上绑定的。

于 2013-05-23T11:05:53.407 回答
1

该指针是识别对象类型的唯一方法。每个对象都必须有一个。

于 2013-05-23T11:01:09.333 回答