4
include <stdio.h>

class Base
{
protected:
    int foo;
    int get_foo() { return foo; }
};

class Derived : public Base
{
public:
    void bar()
    {
        int Base::* i = &Base::foo;
        this->*i = 7;
        printf("foo is %d\n", get_foo());
    }
};


int main()
{
    Derived d;
    d.bar();
}

派生型が基本クラスの保護されたメンバーへのポインターを作成できない理由がわかりません。メンバーにアクセスする権限があります。同様のスコープの関数を呼び出すことができます。メンバーポインタを作成できないのはなぜですか? gcc 4.1.2 を使用していますが、次のエラーが発生します。

test.cc: In member function ‘void Derived::bar()’:
test.cc:6: error: ‘int Base::foo’ is protected
test.cc:15: error: within this context
4

1 に答える 1

5

試行錯誤の末、納得のいく解決策を見つけました。指しているのが基本クラスの継承されたメンバーであっても、ポインターは派生クラスのメンバーポインターである必要があります。したがって、次のコードが機能します。

include <stdio.h>

class Base
{
protected:
    int foo;
    int get_foo() { return foo; }
};

class Derived : public Base
{
public:
    void bar()
    {
        int Derived::* i = &Derived::foo;
        this->*i = 7;
        printf("foo is %d\n", get_foo());
    }
};

int main()
{
    Derived d;
    d.bar();
}

Base のメンバーがプライベートとしてスコープされている場合、予想されるアクセス不足エラーが発生します。

于 2014-07-21T16:09:32.133 に答える