[英]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.