次の階層を検討してください。
struct A {
int a;
A() { f(0); }
A(int i) { f(i); }
virtual void f(int i) { cout << i; }
};
struct B1 : virtual A {
int b1;
B1(int i) : A(i) { f(i); }
virtual void f(int i) { cout << i+10; }
};
struct B2 : virtual A {
int b2;
B2(int i) : A(i) { f(i); }
virtual void f(int i) { cout << i+20; }
};
struct C : B1, virtual B2 {
int c;
C() : B1(6),B2(3),A(1){}
virtual void f(int i) { cout << i+30; }
};
インスタンスの正確なメモリレイアウトは何ですか?
C
含まれているvptrはいくつあり、それぞれが正確に配置されていますか?Cの仮想テーブルと共有されている仮想テーブルはどれですか?各仮想テーブルには正確に何が含まれていますか?ここで私がレイアウトをどのように理解するか:
---------------------------------------------------------------- |vptr1 | AptrOfB1 | b1 | B2ptr | c | vptr2 | AptrOfB2 | b2 | a | ----------------------------------------------------------------
ここで、はを含むインスタンス
AptrOfBx
へのポインタです(継承は仮想であるため)。 あれは正しいですか?どの機能が指しているのですか?どの機能が指しているのですか?A
Bx
vptr1
vptr2
次のコードが与えられた
C* c = new C(); dynamic_cast<B1*>(c)->f(3); static_cast<B2*>(c)->f(3); reinterpret_cast<B2*>(c)->f(3);
f
なぜすべての印刷の呼び出し33
?