C++指针多继承的乐趣

ano*_*non 10 c++ multiple-inheritance

我正在编写一些涉及从基本引用计数指针类继承的代码; 并且出现了一些复杂的C++.我把它减少如下:

假设我有:

class A{};
class B{};
class C: public A, public B {};

C c;
C* pc = &c;
B* pb = &c;
A* pa = &c;

// does pa point to a valid A object?
// does pb point to a valid B object?

// does pa == pb ?
Run Code Online (Sandbox Code Playgroud)

此外,确实:

// pc == (C*) pa ?
// pc == (C*) pb ?
Run Code Online (Sandbox Code Playgroud)

谢谢!

sth*_*sth 8

  • pa指向有效的A对象?
  • pb是否指向有效的B对象?

是的,C*转换得到papb指向正确的地址.

  • pa == pb?

不,通常不是.在同一地址不能有A对象和B对象.

此外,是吗

  • pc ==(C*)pa?
  • pc ==(C*)pb?

强制转换将指针转换回C对象的地址,因此两个等式都为真.

  • @Skizz:默认情况下假设基类不为空.一个新手不需要被他的例子的技术性误导.`pa == pb`未定,答案肯定不是肯定的. (2认同)

Nan*_*iao 5

第28项含义指针比较的C ++常识:基本中间体编程)解释在C ++对象指针的键:

在 C++ 中,一个对象可以有多个有效地址,指针比较不是地址问题。这是一个关于对象身份的问题。

看一下代码:

class A{};
class B{};
class C: public A, public B {};

C c;
C* pc = &c;
B* pb = &c;
A* pa = &c;
Run Code Online (Sandbox Code Playgroud)

class C源自于class Aand class B,所以class C都是class Aand class B。该对象C c有 3 个有效地址:地址为class Aclass Bclass C。实现取决于编译器,因此您不能假设 的内存布局class C,它可能是这样的:

 ----------  <- pc (0x7ffe7d10e1e0)
 |        |
 ----------  <- pa (0x7ffe7d10e1e4)
 | A data |
 ----------  <- pb (0x7ffe7d10e1e8)
 | B data |
 ----------
 | C data |
 ----------
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,虽然pc,pa和的地址值pb不一样,但它们都指向同一个对象(c),所以编译器必须确保pc比较两者都等于paand pb,即,pc == paand pc == pb。编译器通过将要比较的指针之一的值调整为适当的偏移量来完成此比较。例如,

pc == pa
Run Code Online (Sandbox Code Playgroud)

翻译成:

pc ? ((uintptr_t)pc + 4 == (uintptr_t)pa) : (pa == 0)
Run Code Online (Sandbox Code Playgroud)

别的不说,因为AB有没有继承关系,我们无法比拟papb直接。

对于您的问题:

(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.
Run Code Online (Sandbox Code Playgroud)