0
class X {

  int i;

public:

  X() { i = 0; }

  void set(int ii) { i = ii; }

  int read() const { return i; }

  int permute() { return i = i * 47; }
};

上記はクラスXの定義です

別のクラス Y があります

class Y : public X {

    int i; // Different from X's i

public:

    Y() { i = 0; }

    int change() {
        i = permute(); // Different name call
        return i;
    }

    void set(int ii) {
        i = ii;
        X::set(ii); // Same-name function call
    }
};

クラスXもiという名前の変数で構成されており、クラスYに継承されているのではないかと疑っていますが、クラスYのiはそれを上書きする必要がありますが、クラス(Y)のサイズは8になっています.

第二に、ラインのために

X::set(ii)

このような関数を呼び出すことができますか? このクラス X の関数は、任意のオブジェクトに対して呼び出されますか?

事前に多くの感謝

4

2 に答える 2

5

Y::i何もオーバーライドしません(仮想関数のみをオーバーライドできます)。非表示X::iなるため、2つの異なるがあります。1iつは基本クラスにあり、もう1つは派生クラスにあります。

2番目の質問に対して、クラスの外では、X::set(ii);whensetstaticメンバー関数である場合のような構文のみを使用でき、通常の関数やvirtualメンバー関数は使用できません。クラス内では、これを使用して、特定のクラスのメンバー関数の定義を強制的に使用できます。

編集:私はおそらくトリッキーな(やや関連した)質問に答える必要があります:静的タイプが使用される動的タイプと異なる場合はどうなりますiか?たとえば、簡略化されたバージョンについて考えてみましょう。

class base { 
protected:  // we'll make `i` protected, so `derived` can access it if necessary.
    int i;
public:
    base() : i(0) {}
    void hide() { i = 2; }
    virtual void set() { i = 10; }
};

class derived : public base { 
    int i;
public:
    derived() : i(0) {}
    void hide() { i = 1; }
    void set() { i = 5; }
};

さて、setは仮想なので、呼び出しmainはになりderived::setます。hideは仮想ではないため、呼び出しはになりmainますbase::hide()。問題は、それぞれがどのクラスiに割り当てるのかということです。

答えはかなり単純です。関数が仮想である場合でも、変数は仮想ではないため、各関数は独自のクラスの変数を参照します。どの関数をvirtual呼び出すかを制御しますが、その関数によって参照される変数は制御しません。

于 2012-06-14T03:11:37.137 に答える
4

コードにはオーバーライドはなく、名前を非表示にするだけであることに注意してください。

クラスXもiという名前の変数で構成されており、クラスYに継承されているのではないかと思いますが、クラスYのiはそれを上書きする必要がありますが、クラス(Y)のサイズは8になります。

継承は変数を上書きしません。iinクラスはクラスからY名前を非表示にしますが、両方が存在するため、サイズは8です。iX

X :: set(ii)このような関数を呼び出すことはできますか?クラスXのこの関数は、任意のオブジェクトに対して呼び出されますか?

クラス内から、 fromがのではなく静的な方法で呼び出されるというYこの修飾された呼び出し要求。setXsetY

于 2012-06-14T03:11:22.927 に答える