2012-04-22 93 views
1

我有這樣的代碼片段C++繼承與訪問修飾符

#include <iostream> 
    using namespace std; 
    class Polygon 
    { 
     public: 
      int publicmemberPolygon; 
     private: 
      int privatememberPolygon; 
     protected: 
      int protectedmemberPolygon; 
    }; 

    class Square : public Polygon 
    { 
    public: 
     int Getter(); 
    }; 
    int Square::Getter() 
    { 
    return privatememberPolygon; 
    } 

    int main() 
    { 
    } 

的問題是,爲什麼privatememberPolygon是inaccesbile?是不是,當你有一個精緻的類時,它的所有成員/函數都被複制了?謝謝

回答

3

不,您從基類公開派生時,只有其publicprotected成員可以訪問派生類。您也可以閱讀這FAQ

見這個例子:

class Base 
{ 

public: 
    void setPrivate(int p) 
    { 
     m_private = p; 
    } 

public: 
    int m_public; 
protected: 
    int m_protected; 
private: 
    int m_private; 
}; 

class Derived : public Base 
{ 
public: 
    void f() 
    { 
     m_public = 0; // Can access public member of base class 
     m_protected = 0; //Can access protected member of base class 
     m_private = 0; //Compiler error- Can not access private member of base class 
    } 
}; 

int main() { 

    Derived d; 
    d.setPrivate(10); //m_private is still part of the derived class. Hence can call setPrivate 
    return 0; 

} 
+0

我不明白,嗯,當我們說繼承,基類的所有成員/功能被複制到子類正確? – WantIt 2012-04-22 03:16:01

+0

還是隻有公共和受保護的成員自動「複製」到該新的派生類? – WantIt 2012-04-22 03:17:24

+0

它取決於訪問說明符。 – 2012-04-22 03:17:32

2

只有公衆和受保護的數據成員在繼承訪問,當你繼承公開。

2

成員不會「複製」到派生類中。派生類包含基類的子對象,幾乎與有成員變量的子對象相同。

事實上,組成和非公有繼承通常被認爲是解決同一問題的兩條途徑。

帶有非公有繼承的一個微不足道的區別是基礎子對象的成員不必通過對象名稱來找到它們,它們是其中的一部分(除非你有鑽石繼承, !)。對於公共繼承,還有一個從派生類的指針或引用到基類的指針或成員的隱式轉換。

更大的區別是繼承允許覆蓋虛擬功能,而組合不允許。

protected成員(和鹼基)在最終分析中實際上是無用的,因爲它們抑制組成而沒有像virtual那樣提供真正的益處。有時他們在虛擬函數已經使繼承成爲必要時使用。