多重继承中的指针相等

pointer equality in multiple inheritance

本文关键字:指针 多重继承      更新时间:2023-10-16

我想知道当涉及到多重继承时,指针是如何进行比较的。在某些情况下,他们似乎是平等的,尽管地址明显不同。请参阅以下代码:

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.