2014-02-09 88 views
0

使用繼承時,我從一個教程,說關於C甲混亂++繼承

相反地讀,如果最限制訪問級別被指定(私有),所有的基類成員被繼承爲不公開,因而不能從派生類訪問。

所以我測試下面的代碼,但派生類仍然可以訪問基類的成員。

爲什麼?

#include <iostream> 
using namespace std; 

class Polygon { 
    protected: 
    int width, height; 
    public: 
    Polygon():width(10),height(10){} 
}; 
class Rectangle: private Polygon { 
    public: 
    int area() 
     { return height; } 
}; 
int main() { 
    Rectangle rect; 
    cout << rect.area() << '\n'; 
    return 0; 
} 

輸出是10

回答

3

派生類型可以訪問基類的成員publicprotected。這與繼承的類型無關。但是,如果繼承爲private,則派生類型中的成員全部爲private

class Foo 
{ 
public: 
    int i; 
}; 

class Bar : private Foo 
{ 
public: 
    void hello() { 
    ++i; // OK, I can see Foo's public and protected members 
    } 
}; 

int main() 
{ 
    Bar b; 
    b.hello(); // accesses i internally. OK 
    b.i;  // Error, i is private in Bar 
} 
+0

我明白了。所以這個教程有點誤導我。 – Jianchen

+1

@Janchen是的,你所引用的段落不是很清楚,它很容易被誤解。 – juanchopanza

+0

所以我修改它的示例以查看發生了什麼。無論如何非常感謝 – Jianchen

3

私有繼承意味着所有的基部構件成爲私人到派生類。派生類本身仍然可以訪問成員,但沒有其他派生類可以。

1

按照C++標準

如果一個類被聲明爲使用 私接符另一個類的基類,則 基類的公共和保護成員都可以訪問作爲派生類的私有成員117。

基類

protected: 
    int width, height; 

,這樣在你的例子受保護的數據成員作爲派生類的私有成員和派生類可以訪問它的私有成員達拉的任何成員函數訪問。