指向层次结构中类的指针相等
Equality of pointers to classes in hierarchy
#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
,这表明第一个等式为真,第二个等式也为真,但第三个相等式不为真。既然pa
和pb
都设置为&c
前两个是有意义的,但为什么第三个等式是假的呢?
我在Visual C++ 2012中运行了以下代码,并使用调试器检查地址:
pa == 0x003bfc90
pb == 0x003bfc98
&c == 0x003bfc90
显然,pa
和pb
没有指向同一个地址,这意味着第三个等式应该是假的(确实如此(。但是,为什么前两个是真的呢?你能给我解释一下这是怎么回事吗?
这两个指针确实有不同的值,因为它们指向c
的不同子对象;这两个对象必须存在于不同的位置。
如果没有reinterpret_cast
,相等比较首先寻找一个合适的转换到相同的指针类型。这将&c
从C*
转换为B*
,方法是修改指针值以指向c
的B
子对象 - 与初始化pb
时应用的转换完全相同。转换后,两个指针具有相同的值,因此比较相等。
reinterpret_cast
意味着指针应转换为目标类型而不修改其值,无论该转换是否有意义。因此,在转换之后,指针仍然具有不同的值,并且比较不相等。
相关文章:
- 如何重构类层次结构以避免菱形问题
- 指针或结构的矢量
- C++ 中模板化类型的类层次结构
- 包含矢量指针的结构的内存释放问题
- 尝试将指针与结构一起使用时出错
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 继承层次结构并将元素添加到向量
- C++ 类层次结构中的"对齐"是什么意思?
- 相同的层次结构,访问基类的受保护成员时的行为不同
- 确定大层次结构中基本指针的实际类型,无需dynamic_cast
- 在访问类的树层次结构中的对象时避免使用 null 指针
- dynamic_cast强制转换为指向不在层次结构中的类的指针
- 具有向下强制转换函数指针的类层次结构
- 对象层次结构员工程序 - 取消引用 cout 的指针
- 指向类层次结构的派生部分的指针
- 通过指针在 gdb/Eclipse CDT 调试监视中显示真实的对象层次结构
- 具有指向自身指针的类层次结构
- 指向层次结构中类的指针相等
- c++:指针数据成员在类继承层次结构中的行为
- c++指针和类层次结构导致段错误难题