保証の住所baseclass C++?
-
24-09-2019 - |
質問
Cの構造体は、私が保証される:
struct Foo { ... };
struct Bar {
Foo foo;
...
}
Bar bar;
assert(&bar == &(bar.foo));
現在、C++している場合は:
class Foo { ... };
class Bar: public Foo, public Other crap ... {
...
}
Bar bar;
assert(&bar == (Foo*) (&bar)); // is this guaranteed?
その場合、教えてほしいのですが、参考という、C++のプログラミング言語、ページ"xyz)?
よろしく!
解決
保証はありません。 C ++ 03標準(10月3日、class.derived)から:
は、基本クラスのサブオブジェクトは、最も派生オブジェクト(1.8)に配置される順序が指定されていない。
他のヒント
もレイアウトのための基底クラスです 保証されません おってきているよう考え方もあり保証に係る委員から、これは保証:
Bar bar;
assert(&bar == (Foo*) (&bar));
でのキャストを使用しstatic_cast(5.4)に変換す &bar
正しくは、比較のポインタをベースおよびポインタを導出するためにも同様に。
しかし、こう保証するものではありません:
Bar bar;
void* p1 = &bar;
void* p2 = (Foo*)&bar;
assert(p1 == p2); // not guaranteed
私はそれは想像していない、それがために必要があるだろう、なぜ私にはわからない。
私は関連質問があります。
あなたがダイヤモンドの継承を持っている場合:
class Base(){ virtual void AFunc(){} };
class A:Base{};
class B:Base{void AFunc(){} }
class Test:A,B{};
Base * b = (Base*)new Test;
b->AFunc();
は、そのメモリ構造をとることができ塩基である:A:B:試験
の呼び出しの時点でのノートは、すべてのコンパイラはオブジェクトの先頭のアドレスであることを知っている、とAFuncはBオブジェクトの先頭からの相対であることを期待している、これら2つのアドレスが同じではありません!ので、どのようにそれは動作しますか?
bはB型であったかのように、2つのアドレスが同じになる...
所属していません StackOverflow