2013-05-31 37 views
2

是C++的新手。C++:爲什麼基類對象在派生類中不可訪問,如果受保護

class A 
{ 
    public: 
     int i; 
    protected: //**--- [1]** 
     void set() 
     { 
      i=5; 
      cout<<i; 
     } 
}; 

class B : public A 
{ 
    public: 
     void call() 
     { 
      A obj; 
      obj.set(); //**----[2]** 
      set(); //**---[3]** 
     } 
}; 

int main() 
{ 
    B* b_obj = new B; 
    b_obj->call(); 
} 

爲什麼不編譯的代碼,如果我嘗試包括[2],而不是更換[1]公共但它工作,如果我編譯包括[3]單獨

編譯錯誤:錯誤:'void A :: set()'受保護。

總之,我的目的是瞭解爲什麼基類對象不能在派生類中調用,如果基類接口的訪問說明符被設置爲受保護的。

+0

我相信'A'是'Pet''''''''',但這是一個瘋狂的猜測。 @OP - 請澄清。 –

回答

1

Pet無關AB,因此無論f.set()允許取決於Pet定義。相比之下,只有set()可以工作,因爲它在基類中受到保護,因此可以在派生類中訪問。

+0

感謝您指出錯誤。現在糾正了。 – Xpeditor

2

不知道如果我的回答是正確的,但這裏有雲:

組在A級保護這意味着沒有外界的成員可以訪問組,但是派生類可以。

當本身b。您調用的函數從一個派生類B的內部派生函數中調用set(),這意味着,編譯器會接受這一點,因爲該功能保護(訪問派生類。)

然而,當你定義一個obj,調用obj.set(),相對於obj實例,調用是類外部的,因此編譯器會給出錯誤。

希望有所幫助。

相關問題