多重继承中的指针相等
pointer equality in multiple inheritance
我想知道当涉及到多重继承时,指针是如何进行比较的。在某些情况下,他们似乎是平等的,尽管地址明显不同。请参阅以下代码:
class A {
int m_i;
};
class B {
double m_d;
};
class C: public A, public B {
char m_c;
};
int main() {
C c;
A *pa = &c;
B *pb = &c;
std::cout << "Address of c is: " << &c << std::endl;
std::cout << "A type pointer to c is: " << pa << std::endl;
std::cout << "B type pointer to c is: " << pb << std::endl;
std::cout << "if pa == &c: " << (pa == &c) << std::endl;
std::cout << "if pb == &c: " << (pb == &c) << std::endl;
return 0;
}
输出为:
c的地址为:00F6F870
指向c的类型指针是:00F6F870
指向c的B型指针为:00F6F878
如果pa==&c: 1
如果pb==&c: 1
难怪pb与&c.奇怪的是(pb==&c(传递1。我现在很困惑(pb==&c(是如何实际评估的。
您只能比较具有相同类型的值。注意,为了这个答案,我忽略了operator==
过载的情况。
在这里,您将比较指向不同类的两个指针。此时,编译器试图弄清楚是否可以将其中一个指针转换为另一个指针的类型。
指向子类的指针可以自动转换为指向其超类的指针。这就是编译器所做的。最终结果是相同的实际指针值,并且它们比较起来是相等的。
此行:
std::cout << "if pb == &c: " << (pb == &c) << std::endl;
为了比较CCD_ 2和CCD_。我们已经知道(B*)&c
会产生pb
中的值,所以这里实际发生的事情很简单
std::cout << "if pb == &c: " << (pb == (B*)&c) << std::endl;
这导致比较相等的值。
class X {
char m_x;
};
class A {
int m_i;
};
class B {
double m_d;
};
class C: public X, public A, public B {
char m_c;
};
int main() {
C c;
A *pa = &c;
B *pb = &c;
void *va = pa;
void *vb = pb;
std::cout << "Address of c is: " << &c << std::endl;
std::cout << "A type pointer to c is: " << pa << std::endl;
std::cout << "B type pointer to c is: " << pb << std::endl;
std::cout << "void type pointer equal to pA is: " << va << std::endl;
std::cout << "void type pointer equal to pB is: " << vb << std::endl;
std::cout << "if pa == &c: " << (pa == &c) << std::endl;
std::cout << "if pb == &c: " << (pb == &c) << std::endl;
std::cout << "if va == &c: " << (&c == va) << std::endl;
std::cout << "if vb == &c: " << (&c == vb) << std::endl;
return 0;
}
产生以下结果:
Address of c is: 0x75270a47f5f0
A type pointer to c is: 0x75270a47f5f4
B type pointer to c is: 0x75270a47f5f8
void type pointer equal to pA is: 0x75270a47f5f4
void type pointer equal to pB is: 0x75270a47f5f8
if pa == &c: 1
if pb == &c: 1
if va == &c: 0
if vb == &c: 0
编译器将&c地址,方法是将其强制转换为与您比较的指针相同的类型。为了明确这一点,我使用另一个类替换了类A,然后当我将地址复制到void*指针时,很明显,存储的实际"value"与&c.
相关文章:
- 关于C++中具有多重继承"this"指针的说明
- 带有此指针的模板类多重继承构造函数不起作用?
- 多重继承 c++ 和指针
- 指针到成员函数和多重继承
- C 多重继承和向上的智能指针破坏会导致VS 2017中的堆腐败
- 指针调整没有多重继承
- C 多重继承 - 编译器修改我的指针
- 多重继承指针比较
- 多重继承期间的对象构造和虚拟指针
- MinGW 4.7.0 到 4.7.2 错误:使用混合虚拟和非虚拟多重继承时成员函数中的"this"指针无效
- 指向多重继承中继承的数据成员的指针
- 从一个基类的指针对另一个基类的多重继承和泛型访问
- C++多重继承+虚拟函数(-歧义)=怪异行为(也是函数指针)
- 在C++多重继承的情况下如何获得正确的指针"alignment"?
- 多重继承和this指针
- 多重继承和指针实现
- 虚拟多重继承和指针
- 多重继承中的指针相等
- 在c++中获取一个类的指针,该类是另一个具有多重继承的类的一部分
- 比较指针.多重继承问题