我最近正在接受采访,其中C/C++是主要语言,在一个问题中,我被告知可以使用vtable来确定基本指针实际存储的层次结构中的哪个类.
所以,如果,例如,你有
class A
{
public:
A() {}
virtual ~A() {}
virtual void method1() {}
};
class B : public A
{
public:
B() {}
virtual ~B() {}
virtual void method1() {}
};
Run Code Online (Sandbox Code Playgroud)
并且您实例化A * pFoo = new B(),是否确实可以使用vtable来确定pFoo是否包含指向A或B实例的指针?
Mar*_*n B 11
这显然是依赖于实现的,但是在大多数实现中,类的对象的内存中表示A或者B将以指向vtable的指针开始.你可以看一下这个虚函数表指针,把它比作虚函数表指针,你知道是类对象A或B,并确定类这样的对象.
为了说明(当然这不是好的风格):
A *pFoo=new B(); // pointer to object of unknown class (either A or B)
A a; // Object known to be of class A
B b; // Object known to be of class B
void *vptrA=*((void **)&a); // Pointer to vtable of class A
void *vptrB=*((void **)&b); // Pointer to vtable of class B
void *vptrFoo=*((void **)pFoo); // Pointer to vtable of unknown object
if(vptrFoo==vptrA)
printf("Class A\n");
else
printf("Class B\n");
Run Code Online (Sandbox Code Playgroud)
重要提示:这只是大多数实现工作原理的说明; 除了依赖于实现之外,这种技术在存在多重继承时会崩溃.你应该永远不会做这样的产品代码中任何东西; 请改用RTTI.