Item 28 Meaning of Pointer Comparison en C++ Common Knowledge: Essential Intermediate Programming) explique la clé du pointeur d'objet en C++:
En C++, un objet peut avoir plusieurs adresses valides, et la comparaison de pointeur n'est pas une question sur les adresses. C'est une question sur l'identité de l'objet.
Jetez un oeil sur le code:
class A{};
class B{};
class C: public A, public B {};
C c;
C* pc = &c;
B* pb = &c;
A* pa = &c;
class C
aussi bien de ses class A
et class B
, donc class C
est à la fois class A
et class B
. l'objet C c
a 3 adresses valides: adresse pour class A
, class B
et class C
. La mise en œuvre dépend du compilateur, de sorte que vous ne pouvez pas assumer la mise en page de mémoire de class C
, et il peut comme ceci:
---------- <- pc (0x7ffe7d10e1e0)
| |
---------- <- pa (0x7ffe7d10e1e4)
| A data |
---------- <- pb (0x7ffe7d10e1e8)
| B data |
----------
| C data |
----------
Dans le cas ci-dessus, bien que la valeur d'adresse de pc
, pa
et pb
ne sont pas identiques, ils se réfèrent tous au même objet (c
), donc le compilateur doit s'assurer que pc
compare égale à la fois pa
et pb
, soit pc == pa
et pc == pb
. Le compilateur effectue cette comparaison en ajustant la valeur de l'un des pointeurs comparés par le décalage approprié. Par exemple,
pc == pa
est traduit:
pc ? ((uintptr_t)pc + 4 == (uintptr_t)pa) : (pa == 0)
, entre autres, depuis A
et B
ont aucune relation d'héritage, nous ne pouvons pas comparer directement pa
et pb
.
Pour vos 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.
que voulez-vous dire par ==? Évidemment, les adresses sont les mêmes. –
Les adresses ne sont pas nécessairement les mêmes. –
Dans une implémentation d'héritage multiple (virtuel) que j'ai vu, un certain décalage est ajouté à l'adresse de base de l'objet de la classe dérivée pour accéder aux attributs et méthodes de B. Cependant, cela n'est pas visible pour l'utilisateur. Par conséquent, dans votre programme, vous pouvez toujours voir que l'adresse de A, B et C sont les mêmes. – mukeshkumar