2014-07-21 166 views
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 
+0

順便說一句,如果我添加一個朋友聲明,這工作得很好,但對於我只是試圖訪問一個我應該有權訪問的受保護成員而言,將我的派生類聲明爲朋友似乎很奇怪。 –

+1

'int Base :: * i =&Derived :: foo;'很好地順便說一句。 – dyp

+0

我想禁止這個的原因與禁止訪問另一個「Base」類型對象的'foo'相同;即'Base b; b.foo = 42;'在Derived :: bar'中也是禁止的。 – dyp

回答

5

通過試驗和錯誤我發現了一個解決方案,它有一定的意義。即使它是您指向的基類繼承成員,指針仍應該是Derived類的成員指針。所以,下面的代碼工作:

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(); 
} 

如果基地成員和作用域爲私有,那麼你得到的預期缺乏訪問錯誤的。

相關問題