C++ pointer multi-inheritance fun

后端 未结 5 1513
自闭症患者
自闭症患者 2020-11-30 09:02

I\'m writing some code involving inheritance from a basic ref-counting pointer class; and some intricacies of C++ popped up. I\'ve reduced it as follows:

Suppose I h

5条回答
  •  情深已故
    2020-11-30 09:52

    Item 28 Meaning of Pointer Comparison in C++ Common Knowledge: Essential Intermediate Programming) explains the key of object pointer in C++:

    In C++, an object can have multiple, valid addresses, and pointer comparison is not a question about addresses. It's a question about object identity.

    Take a look at the code:

    class A{};
    class B{};
    class C: public A, public B {};
    
    C c;
    C* pc = &c;
    B* pb = &c;
    A* pa = &c;
    

    class C derives from both class A and class B, so class C is both class A and class B. the object C c has 3 valid addresses: address for class A, class B and class C. The implementation depends on compiler, so you can't assume the memory layout of class C, and it may like this:

     ----------  <- pc (0x7ffe7d10e1e0)
     |        |
     ----------  <- pa (0x7ffe7d10e1e4)
     | A data |
     ----------  <- pb (0x7ffe7d10e1e8)
     | B data |
     ----------
     | C data |
     ----------
    

    In above case, although the address value of pc, pa and pb aren't same, they all refer to the same object (c), so the compiler must ensure that pc compares equal to both pa and pb, i.e., pc == pa and pc == pb. The compiler accomplishes this comparison by adjusting the value of one of the pointers being compared by the appropriate offset. E.g.,

    pc == pa
    

    is translated to:

    pc ? ((uintptr_t)pc + 4 == (uintptr_t)pa) : (pa == 0)
    

    Among other things, since A and B have no inheritance relationship, we can't compare pa and pb directly.

    For your questions:

    (1) does pa point to a valid A object?  
    (2) does pb point to a valid B object?  
    Yes, refer the above diagram. 
    
    (3) pc == (C*) pa ?  
    (4) pc == (C*) pb ?  
    Yes, No need to add (C*).
    
    (5) does pa == pb ?
    No. We can't compare them.
    

提交回复
热议问题