在c++中,我们在每个对象中都有VPTR,但每个类只有一个VTABLE。为什么VPTR存在于每个对象中?它不是重复的吗?
发布于 2013-05-23 19:02:02
没有运行时类型信息,您就不知道对象在哪个类中。因此,为了调用方法,您需要存储类信息,然后使用它来查找要调用的正确vtable。只需在每个对象中放置一个指针就更容易(也更直接)。
发布于 2013-05-23 19:06:37
如果您有:
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-23 18:59:30
内存中C++对象的实例如何引用它的VTABLE?然而,VPTR-VTABLE是编译器特定的实现,C++标准没有对它做任何说明。通常,它是多态类实例的第一个(隐藏)成员。
这是有代价的,因为拥有这样的隐藏成员使得C++内存模型与C不兼容。这是一个开销,同意,但没有其他(更好的)方法从内存中的C++对象的实例引用VTABLE。
https://stackoverflow.com/questions/16712157
复制相似问题