- スレを勃てるまでもないC/C++の質問はここで 22
803 :デフォルトの名無しさん[sage]:2014/11/12(水) 09:26:17.12 ID:+hAxVh0F - 仮想関数テーブルについてですが:
http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E9%96%A2%E6%95%B0%E3%83%86%E3%83%BC%E3%83%96%E3%83%AB class B2 { public: virtual void f2() {} int int_in_b2; }; class D : public B1, public B2 { public: virtual void d() {} virtual void f2() {} // B2::f2() をオーバーライド int int_in_d; }; virtual method table of B2: +0: B2::f2() +4: B2::~B2() virtual method table of D (for B2): +0: D::d() +4: D::f2() // B2::f2() is overridden by D::f2() +8: D::~D() の部分、B2::f2() と D::f2() の位置(エントリー)がずれていませんか?
|
- スレを勃てるまでもないC/C++の質問はここで 22
804 :デフォルトの名無しさん[sage]:2014/11/12(水) 09:30:08.28 ID:+hAxVh0F - 補足:
「D *d = new D(); B1 *b1 = dynamic_cast<B1*>(d); B2 *b2 = dynamic_cast<B2*>(d); d と b1 が実行時に同じメモリ位置を参照するが、 b2 は d+8 (d のメモリ配置 の 8バイト後方)を示す。 そのため、b2 は d 内の B2 らしく見える領域、 すなわち B2 のインスタンスと同じメモリレイアウトを持つ部分を示す。」 英語版Wikipediaでは: d: +0: pointer to virtual method table of D (for B1) +4: value of int_in_b1 +8: pointer to virtual method table of D (for B2) +12: value of int_in_b2 +16: value of int_in_d Total size: 20 Bytes. virtual method table of D (for B1): +0: B1::f1() // B1::f1() is not overridden virtual method table of D (for B2): +8: D::f2() // B2::f2() is overridden by D::f2() となっており、DのB2用のvtableの D:f2() の位置がまた違っている。 日本語版では、+4の位置なのに、英語版では+8の位置。 自分の考えでは、「+0」が正しい位置のように思えます。
|
- スレを勃てるまでもないC/C++の質問はここで 22
806 :デフォルトの名無しさん[sage]:2014/11/12(水) 10:02:55.65 ID:+hAxVh0F - コンパイラ関係ツールを作成するため。
|