トップページ > プログラム > 2014年11月12日 > +hAxVh0F

書き込み順位&時間帯一覧

11 位/182 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000002100000000000003



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
スレを勃てるまでもないC/C++の質問はここで 22

書き込みレス一覧

スレを勃てるまでもない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
コンパイラ関係ツールを作成するため。


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。