0

Java/C# のバックグラウンドを持っているので、C++ で何が起こっているのかを理解するのに少し助けが必要です...

class A {
   int x;
   public:
   A(int x) : x(x){}

   void f(int y) {
     cout << x + y << endl;
   }
};

class B : virtual A {
    int x;
    public:
    B(int x) : A(2*x), x(x) {}
    virtual void f(int y){
        cout << x + 2*y << endl;
    }
};

void h(){
    B b(5);
    A &a = dynamic_cast<A &>(b);
    a.f(10);
    b.f
}

void g() {
    A *a = this;
    a->f(10);
    B *b = dynamic_cast<B *>(a);
    b->f(10);
 }

h() の呼び出しは問題ありませんが、g() の呼び出しは機能しません。誰かが理由を説明できますか?また、行 A(int x) : x(x){} では : x(x){} は何をしますか? B(int x) : A(2*x), x(x) および : A(2*x), x(x) についても同じ質問です。

ご協力いただきありがとうございます。

4

4 に答える 4

2

A(int x) : x(x){} : x(x){} は何をしますか?

: x(x)初期化リストです。括弧内の変数は受け取った引数で、外側の変数はメンバー変数です。これは、メンバー変数が、受け取った引数xの値で初期化されることを意味します。x

B(int x) : A(2*x)

Aここでは、整数を受け取る基底クラスのコンストラクター (つまり ) を呼び出しています。xコンストラクターが受け取る変数ですB。これは、派生クラス コンストラクターからパラメーター化された基本クラス コンストラクターを呼び出す方法です。デフォルトでは、派生クラス コンストラクターはデフォルトの基本クラス コンストラクターを呼び出します。あなたの場合、A(2*x)基本クラスにデフォルトのコンストラクターがないため、を提供しないと失敗します。

于 2013-07-31T15:11:03.157 に答える
1

1) MSDNに従って(関連する質問に回答g());

thisポインターは、クラス、構造体、または共用体型の非静的メンバー関数内でのみアクセスできるポインターです。メンバー関数が呼び出されるオブジェクトを指します。静的メンバー関数には this ポインターがありません。

2)A(int y) : x(y) {}初期化( ie内の値を持つ前のA::xメンバー(理解を深めるために変更された変数名)。 の場合と同じです。パラメーターを使用して基本クラスの ( ) コンストラクターを呼び出し、 , 内の値で初期化します。すなわち。()"()"yB(int x) : A(2*x), x(x) {}A2*xB::x()x

3)また、キャストされているオブジェクトには少なくとも 1 つの仮想関数が必要であるため、コンパイル エラーがスローされるg()ため、機能しません。唯一の仮想関数がデストラクタである場合は、機能します。dynamic_cast<>dynamic_cast<>

于 2013-07-31T15:49:07.157 に答える