C ++对象如何访问其成员函数?

时间:2010-10-05 13:59:07

标签: c++

C ++对象如何知道它的成员函数定义存在于何处?我很困惑,因为Object本身不包含函数指针。 对象上的sizeof证明了这一点。 那么Runtime环境如何完成函数映射的对象呢?哪个类的成员函数指针表保持不变?

4 个答案:

答案 0 :(得分:10)

如果你正在调用非虚函数,则不需要函数指针表;编译器可以在编译时解析函数地址。所以:

A a;
a.func();

转换为以下内容:

A a;
A_func(&a);

通过基类指针调用虚函数通常使用vtable。所以:

A *p_a = new B();
p_a->func();

转换为以下内容:

A *p_a = new B();
p_a->p_vtbl->func(p_a);

其中p_vtbl是一个编译器实现的指针,指向特定于*p_a实际类的vtable。

答案 1 :(得分:1)

对象及其成员函数通常有两种关联方式:

  • 对于非虚函数,编译器在编译时确定适当的函数。非静态成员函数通常传递一个隐藏参数,该参数包含this指针,该指针负责对象和类成员函数的关联。
  • 对于虚函数,大多数编译器倾向于使用通常通过对象的this指针或类似机制引用的查找表。该表通常称为vtable,仅包含虚函数的函数指针。

由于C ++不是动态语言,编译器可以在编译时执行大部分对象/函数/符号解析,但某些虚函数除外。在某些情况下,编译器甚至可以确切地确定调用哪个虚函数实例,并通过vtable跳过解析。

答案 2 :(得分:0)

成员函数不是对象的一部分 - 它们在一个地方静态定义,就像任何其他函数一样。没有神奇的查找需要。

虚拟功能有所不同,但我不认为你的问题是关于......

答案 3 :(得分:0)

对于非虚函数,所有实例都使用一个(全局,每类)函数表。因为对于所有这些都是相同的 - 在编译时确定性 - 你不希望它在每个实例中重复。

对于虚函数,解析在运行时完成,对象将包含一个函数表。试试看,然后再看一下你的对象。