我对虚拟表的功能不太了解,但在下面粘贴的代码中 - 传递的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();
}
指针的功能,我将非常感激。
答案 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表。
答案 2 :(得分:0)
不,每个功能(成员或非成员)对应的代码只有一个副本。该函数使用this
指针来确定实际操作的对象。
您没有任何virtual
方法,因此您的代码中根本没有vtable。