C ++对象如何知道它的成员函数定义存在于何处?我很困惑,因为Object本身不包含函数指针。
对象上的sizeof
证明了这一点。
那么Runtime环境如何完成函数映射的对象呢?哪个类的成员函数指针表保持不变?
答案 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)
对于非虚函数,所有实例都使用一个(全局,每类)函数表。因为对于所有这些都是相同的 - 在编译时确定性 - 你不希望它在每个实例中重复。
对于虚函数,解析在运行时完成,对象将包含一个函数表。试试看,然后再看一下你的对象。