1

保護されたメンバーを持つ抽象基本クラスがある場合、派生クラスにのみ読み取りアクセスを提供するにはどうすればよいですか?

私の意図を説明するために、最小限の例を示します。これが基本クラスです。

class Base
{
public:
    virtual ~Base() = 0;
    void Foo()
    {
        Readonly = 42;
    }
protected:
    int Readonly;                 // insert the magic here
};

これは派生クラスです。

class Derived : public Base
{
    void Function()
    {
        cout << Readonly << endl; // this should work
        Readonly = 43;            // but this should fail
    }
};

残念ながらconst、基本クラスで変更できる必要があるため、メンバーを使用できません。意図した動作をどのように生成できますか?

4

3 に答える 3

8

これを行う通常の方法はprivate、基本クラスでメンバーを作成し、protectedアクセサーを提供することです。

class Base
{
public:
    virtual ~Base() = 0;
    void Foo()
    {
        m_Readonly = 42;
    }
protected:
    int Readonly() const { return m_Readonly; }
private:
    int m_Readonly;
};
于 2013-03-17T10:52:13.040 に答える
4

保護されたメンバーは派生クラスで表示されるため、メンバーを派生クラスで読み取り専用にしたい場合は、プライベートにしてゲッター関数を提供できます。

class Base {
public:
    Base();
    virtual Base();

    public:
         int getValue() {return value;}

    private:
         int value;
}

このようにして、基本クラスの値を変更できますが、子クラスでは読み取り専用です。

于 2013-03-17T10:52:34.147 に答える
0

継承のベスト プラクティス ガイドラインは、常にメンバー変数をプライベートにし、アクセサー関数をパブリックにすることです。派生クラスからのみ呼び出したいパブリック関数がある場合は、スパゲッティ コードを作成していることを意味します。(ソース: Meyer の効果的な C++ 項目 22)

于 2014-01-13T19:22:25.283 に答える