如何使用vtable来确定类类型

Ale*_*man 7 c++ vtable

我最近正在接受采访,其中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的指针开始.你可以看一下这个虚函数表指针,把它比作虚函数表指针,你知道是类对象AB,并确定类这样的对象.

为了说明(当然这不是好的风格):

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.