繁体   English   中英

“ this”指针与Vtable函数之间的关系

[英]Relation between 'This' Pointer and Vtable Functions

我对虚拟表的功能没有太多了解,但是在下面粘贴的代码中-传递的this指针显然在2种情况下指向不同的位置-但是内存中的show()函数是否已实例化/是在运行时为每个对象分别创建的含义? (原谅我对C ++行话的理解不佳)

#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();
}

如果可以提供一个有关虚拟表如何工作的示例(如果可能,还提供一些内存图),并且可以解释this指针与虚拟表的功能,那么我将不胜感激。

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对象没有一个A::show() 总共有一个A::show() ,并且将调用它的实例作为参数。

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

看看Marshall Cline对虚拟功能有何评论

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM