struct Base1 {
int value1;
Base1() : value1(1) {}
};
struct Base2 {
int value2;
Base2() : value2(2) {}
};
struct Derived : public Base1, public Base2 {};
void func(int Derived::*pmf, Derived *d)
{
printf("%d\n", d->*pmf);
}
void func2()
{
Derived d;
int Base2::*b = &Base2::value2;
func(b, &d);
}
int main()
{
func2();
}
Output is 2
こんにちは皆さん。 私はInside the c++ object modelという本を読んでいます。メンバーデータの章へのポインタです。ピクチャには、第2の基本クラスのデータメンバへのポインタが関数に渡され、派生クラスのメンバへのポインタを要求するコードがあります。私はその場で何が起こっているのか本当に分かりません。このような変換は、特に明示的なキャストが使われていない限り、クラスへのポインタの観点から考えると、そういったことは許されませんが、コンパイラが渡されたポインタを調整すると言われています関数に渡す。 私の2つの質問は次のとおりです:メンバーデータ変換のポインター
1)この状況で何が起こっているのですか?
2)コンパイラがポインタを調整するだけの場合は、コンパイラがポインタの型を常に知っているか、実行時までポインタ型がわからないときはいつもありますか?
更新:コードを修正し、初期値をvalue1とvalue2に追加しました。 func2()の呼び出し後、出力は '2'になります。これはBase2 :: value2なので、明らかにコンパイラはポインタを調整しました。
コードを画像ではなくプレーンテキストとして送信します。 – Barmar
私は何かが間違っていると思う、ちょうどそのコードがあまり意味をなさない。 –
編集された質問。画像をコードに置き換えました。 –