gpt4 book ai didi

c++ - 如何使用 vtable 确定类类型

转载 作者:可可西里 更新时间:2023-11-01 18:15:27 24 4
gpt4 key购买 nike

我最近参加了一个职位的面试,其中 C/C++ 是主要语言,在一个问题中,我被告知可以使用 vtable 来确定基指针实际存储在层次结构中的哪个类。

所以,例如,如果你有

    class A  
{
public:
A() {}
virtual ~A() {}
virtual void method1() {}
};

class B : public A
{
public:
B() {}
virtual ~B() {}
virtual void method1() {}
};

然后你实例化A * pFoo = new B(),是否真的可以使用虚函数表来确定pFoo是否包含指向A或B实例的指针?

最佳答案

这显然是依赖于实现的,但在大多数实现中,类 AB 的对象在内存中的表示将以指向 vtable 的指针开始。您可以查看此 vtable 指针,将其与您知道属于 AB 类的对象的 vtable 指针进行比较,并以此方式确定对象的类.

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

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");

重要提示:这只是大多数实现如何工作的说明;除了依赖于实现之外,这种技术在多重继承的情况下会失效。你应该永远不要在生产代码中做这样的事情;改用 RTTI。

关于c++ - 如何使用 vtable 确定类类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3006766/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com