在 c++ 中,我们在每个对象中都有 VPTR,但每个类只有一个 VTABLE。为什么 VPTR 在每个对象中?不是重复吗?
问问题
463 次
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 回答