2016-06-28 39 views
3

我閱讀了以下聲明,我不確定它是否屬實,如果可以,請詳細說明一下。如何訪問子女的受保護變量

孩子有權訪問相同INSTANCE的基類 的相同成員變量。

我雖然現在的問題是如何訪問一個孩子

class A 
    { 
    private: 
     class B* myBclass; 
    protected: 
     int bc; 
    } 

    class ChildofA : public A 
    { 
     public: 
     childofA() {}; 
    } 

    class B 
    { 
     public : 
     B() {}; 
     virtual void fun1(A* anA); 
    } 


    class childofB : public B 
    { 
     public : 
     void fun1(A* anA) 
      { 
       anA.bc=1; << Problem here 
      } 

    } 

上面的代碼抱怨一個事實,即公元前變量被保護的受保護的變量。 我想fun1()在ChildofB檢索變量bc的子類ChildofA的實例。你如何去解決這個問題(沒有朋友的方法和get/setter)。

+2

我不認爲你可以。根據定義,受保護的成員需要設置者或朋友方法。您只是試圖訪問一個受保護的成員,並且繼承在這個等式中並不重要。 – goelakash

+0

如果你想從課堂外訪問,爲什麼要聲明'bc'' protected'? –

+0

技術上(但不要這樣做!!)你可以聲明classof childofB是A類的一個朋友類(不是方法),而是重寫你的接口。 – T33C

回答

3

這意味着childOfA有權訪問bc,儘管它被A聲明。孩子可以訪問所有公共和受保護的實例變量。受保護的手段是「私人的,但對我和我的後代而言,而不僅僅是對我而言」。

繼承不會給在B層次結構中的任何東西在A層次結構中查看事物的私有存儲。如果你真的必須聲明一個friend,雖然它可能是很差的風格,或者如果bc意味着可以被其他類訪問,然後公開它。