C++: Comparing pointers of base and derived classesを読んだ後、私はこれがうまくいかないと考えました。2つの異なる継承ポインタアドレスはどのように等しくなりますか?
これを実行すると、c_as_b
と&c
の印刷されたアドレスが異なっていたので、なぜ「同じ階層のポインタを比較するのが安全だ」と表示されますか?真実をもたらす可能性のある印刷された住所の他に何が比較されていますか?
==
が偽になる同様の小さな例を挙げることができますか?
#include <iostream>
using namespace std;
struct A { std::string s; };
struct B { int i; };
struct C : A, B { double d; };
int main() {
C c;
B* c_as_b = &c;
A* c_as_a = &c;
cout << "c_as_a: " << c_as_a << endl
<< "c_as_b: " << c_as_b << endl
<< "&c: " << &c << endl;
cout << (c_as_b == &c ? "seems safe to compare pointers in same hierarchy" : "definately not safe") << endl;
return 0;
}
出力例:
c_as_a: 0xbfb98f10
c_as_b: 0xbfb98f14
&c: 0xbfb98f10
seems safe to compare pointers in same hierarchy
私はこの上の基準を知らないが、 – vu1p3n0x
のdynamic_castを比較する前に、 'Bの*'に変換するために '&C 'に暗黙にはdynamic_castがあるかもしれないように見えることはexpensiすることができ実際に実行されることはありません。 – JDiMatteo
"*印刷されたアドレスのほかに比較されるものは、真実になる可能性がありますか?*"静的に共通型にキャストされた後の2つのポインタ。 –