gpt4 book ai didi

c++ - 使用虚函数进行类型转换

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

在下面的代码中,pC == pA:

class A
{
};

class B : public A
{
public:
int i;
};

class C : public B
{
public:
char c;
};

int main()
{
C* pC = new C;
A* pA = (A*)pC;

return 0;
}

但是当我在B中添加一个纯虚函数并在C中实现时,pA != pC:

class A
{
};

class B : public A
{
public:
int i;
virtual void Func() = 0;
};

class C : public B
{
public:
char c;
void Func() {}
};

int main()
{
C* pC = new C;
A* pA = (A*)pC;

return 0;
}

在这种情况下,为什么 pA 不等于 pC?他们不都仍然指向内存中的同一个“C”对象吗?

最佳答案

您看到指针有不同的值,因为新的虚函数导致将 vtable 指针注入(inject)到您的对象中。 VC++ 将 vtable 指针放在对象的开头(这是典型的,但纯粹是内部细节)。

让我们向 A 添加一个新字段,以便更容易解释。

class A {
public:
int a;
};
// other classes unchanged

现在,在内存中,您的 pAA 看起来像这样:

pA --> | a      |          0x0000004

将 B 和 C 添加到组合中后,您将得到以下结果:

pC --> | vtable |          0x0000000
pA --> | a | 0x0000004
| i | 0x0000008
| c | 0x000000C

如您所见,pA 指向 vtable 之后的数据,因为它对 vtable 或如何使用它一无所知,甚至它在那里。 pC 确实知道 vtable,所以它直接指向表,这简化了它的使用。

关于c++ - 使用虚函数进行类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10002082/

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