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)
谢谢!
- pa指向有效的A对象?
- pb是否指向有效的B对象?
是的,C*转换得到pa并pb指向正确的地址.
- pa == pb?
不,通常不是.在同一地址不能有A对象和B对象.
此外,是吗
- pc ==(C*)pa?
- pc ==(C*)pb?
强制转换将指针转换回C对象的地址,因此两个等式都为真.
第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 A,class B和class 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)
别的不说,因为A和B有没有继承关系,我们无法比拟pa和pb直接。
对于您的问题:
(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)