Sad*_*que 1 c++ managed-c++ visual-c++ c++11
我对虚拟表的功能并不太了解,但是在下面粘贴的代码中 - 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();
}
Run Code Online (Sandbox Code Playgroud)
如果可以提供关于虚拟表如何工作的示例(如果可能的话有一些存储器图)并且this可以解释虚拟表的指针功能,我将非常感激.
A 根本没有vtable(或者它不应该在任何好的编译器上),因为它不是一个多态类:它没有虚拟成员函数.
该函数只show()存在于可执行文件中一次.成员函数与普通的非成员函数没有什么不同,它们只有一个额外的隐式this参数.您可以将其视为编译器将成员函数转换为类似的非成员函数,例如:
void show(A* this)
{
if (this->x == 0)
cout << "\nCalled by OBJ_1";
else
cout << "\nCalled by OBJ_2";
}
Run Code Online (Sandbox Code Playgroud)
而不是OBJ_1.show(),调用这个非成员函数的可比方式将是使用show(&OBJ_1).
A::show()每个A对象都没有创建.总共有一个A::show(),它作为一个参数,它被称为实例.