0

Baseクラスとその派生クラスDerivedが次のようになっているとします。

class Base{
    private:
        _privateVar;

    protected:
        protectedVar;

    public:
        publicVar;

    void publicMethod(someValue, anotherValue)
    {
        protectedVar = someValue;
        publicVar = anotherValue;
    }
};

class Dervied: public Base{

    protected:
        protectedVar:
};

int main(void)
{
    Dervied d;
    d.publicMethod(valueA, valueB);
}

私の質問-

を呼び出すとd.publicMethod(...)、DerivedのprotectedVarが設定されますか、それともBaseクラスのprotectedVarが設定されますか?

ありがとう

--A

4

6 に答える 6

5

それはBaseクラスのものです。基本クラスは派生クラスのメンバーにアクセスできません。

于 2012-06-25T16:25:21.733 に答える
4

を呼び出すとd.publicMethod(...)protectedVarin Derivedが設定されますか、それともBaseクラスのものになりますか?

このメソッドはBaseクラスのメンバーであるため、Baseクラスのメンバーにのみアクセスできます。

メソッドがDerivedクラスに属している場合、そのメソッドはDerivedクラスメンバーにアクセスします。
派生クラスのデータメンバーは、独自のメンバー関数内でアクセスされると、常に基本クラスのデータメンバーを非表示にするためです。

于 2012-06-25T16:24:15.543 に答える
1

メンバー変数をオーバーライドすることはできません。同じ名前を持つ階層内の異なるレベルに別の異なる変数を作成できますが、それらは2つの無関係な変数になります。変数の使用のコンテキスト内で、ルックアップはどちらか一方を見つけ、それがピックアップされて使用されます。

ポリモーフィズムはメンバー関数にのみ適用されvirtual、非仮想関数にもメンバー変数にも適用されません。

于 2012-06-25T16:53:11.023 に答える
0

基本クラスのメンバーが変更されます。データメンバーは、仮想であるかのように動作することはありません。

于 2012-06-25T16:34:05.257 に答える
0

publicMethodはBaseクラスのメソックであるため、基本クラスのprotectedVarが設定されます。

これがあなたの望むものなのか、期待するものなのかはわかりませんが、たとえこれがあなたの望むものであっても、このようにすることはお勧めできません。PC-LINTのようなツールも、おそらくそのような構造について警告します。

于 2012-06-25T16:27:04.943 に答える
0

コンパイラがの定義に達すると、使用するすべての名前Base::publicMethod静的に解決する必要があります。その時点で、これらの名前の唯一の可能な解決策はのメンバーでBaseあるため、生成されたコードはそれらのメンバーにアクセスします。

後でサブクラス化Baseしても、に戻って、に対して生成されたコードを変更することはできませんBase::publicMethod。派生クラスは、別の変換ユニットにある場合もあれば、動的にロードされるライブラリにある場合もあります。


動的ルックアップが必要な場合はprotectedVar、保護された仮想アクセサー関数を介してアクセスします。これにより、派生クラスが変数用に独自のストレージを挿入できるようになります。

とにかく同じタイプの場合Base::protectedVarDerived::protectedVar何が得られるかを確認するのは難しいですが、次のようになります。

class Base
{
    Type protectedVarImpl;

protected:
    virtual Type & protectedVar();
    virtual Type const & protectedVar() const;

public:
    void publicMethod(someValue, anotherValue)
    {
        protectedVar() = someValue; // Note the method call
        publicVar = anotherValue;
    } 
};

Type& Base::protectedVar() { return protectedVarImpl; }
于 2012-06-25T16:36:11.303 に答える