gpt4 book ai didi

c++ - 层次结构中指向类的指针的相等性

转载 作者:搜寻专家 更新时间:2023-10-30 23:56:58 25 4
gpt4 key购买 nike

#include <iostream>

class A
{
public:
A() : m_i(0) { }

protected:
int m_i;
};

class B
{
public:
B() : m_d(0.0) { }

protected:
double m_d;
};

class C
: public A
, public B
{
public:
C() : m_c('a') { }

private:
char m_c;
};

int main()
{
C c;
A *pa = &c;
B *pb = &c;

const int x = (pa == &c) ? 1 : 2;
const int y = (pb == &c) ? 3 : 4;
const int z = (reinterpret_cast<char*>(pa) == reinterpret_cast<char*>(pb)) ? 5 : 6;

std::cout << x << y << z << std::endl;

return 0;
}

此代码打印出 136,这表明第一个相等性为真,第二个也是,但第三个不是。由于 papb 都设置为 &c 前两个是有意义的,但为什么第三个相等是错误的?

我在 Visual C++ 2012 中运行此代码并使用调试器检查地址:

pa == 0x003bfc90
pb == 0x003bfc98
&c == 0x003bfc90

显然,papb 不指向同一个地址,这意味着第三个等式应该为假(事实确实如此)。但是为什么前两个是真的呢?你能给我解释一下这是怎么回事吗?

最佳答案

这两个指针确实具有不同的值,因为它们指向c 的不同子对象;这两个对象必须存在于不同的位置。

如果没有reinterpret_cast,相等比较首先会寻找到相同指针类型的合适转换。通过修改指针值指向 B 子对象,将 &cC* 转换为 B* c - 与初始化 pb 时应用的转换完全相同。转换后,两个指针具有相同的值,因此比较相等。

reinterpret_cast 表示指针应该在不修改其值的情况下转换为目标类型,无论该转换是否有意义。因此,在转换之后,指针仍然具有不同的值,并且比较不相等。

关于c++ - 层次结构中指向类的指针的相等性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26467817/

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