'This'指针和Vtable函数之间的关系

时间:2011-03-18 15:40:13

标签: c++ visual-c++ c++11 managed-c++

我对虚拟表的功能不太了解,但在下面粘贴的代码中 - 传递的this指针明显指向2个案例中的不同位置 - 但函数{{1}在内存中 - 是否实例化/意味着在运行时为每个对象单独创建? (原谅我对C ++术语的理解不足)

show()

如果可以提供关于虚拟表如何工作的示例(如果可能的话,带有一些存储器图),并且可以解释虚拟表的#include<iostream> using namespace std; class A { int x; public: A(){x=0;} A(int z){x=z;} void show() { if(x==0) cout<<"\nCalled by OBJ_1"; else cout << "\nCalled by OBJ_2"; } }; int main() { A OBJ_1,OBJ_2(1); OBJ_1.show(); OBJ_2.show(); } 指针的功能,我将非常感激。

3 个答案:

答案 0 :(得分:7)

A根本没有vtable(或者它不应该在任何好的编译器上),因为它不是多态类:它没有虚拟成员函数。

函数show()只存在于可执行文件中一次。成员函数与普通的非成员函数没有什么不同,它们只有一个额外的隐式this参数。您可以将其视为编译器将成员函数转换为类似的非成员函数,例如:

void show(A* this)
{
    if (this->x == 0)
        cout << "\nCalled by OBJ_1";
    else    
        cout << "\nCalled by OBJ_2";  
}

而不是OBJ_1.show(),调用此非成员函数的可比方式是使用show(&OBJ_1)

创建的每个A::show()对象没有A个。总共有一个A::show(),它将调用它的实例作为参数。

答案 1 :(得分:1)

C ++标准没有明确定义术语“虚拟表”。实现可以以任何方式自由地实现多态类(具有至少一个虚函数的类)。但是大多数常见的实现都使用带有v-ptr的v表。

查看Marshall Cline has to say about virtual functions

答案 2 :(得分:0)

不,每个功能(成员或非成员)对应的代码只有一个副本。该函数使用this指针来确定实际操作的对象。

您没有任何virtual方法,因此您的代码中根本没有vtable。