C++繼承:公有,私有,保護
轉載自:http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html
公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。
- 公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。
- 私有繼承(private)
私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問。
- 保護繼承(protected)
保護繼承的特點是基類的所有公有成員和保護成員都成為派生類的保護成員,並且只能被它的派生類成員函式或友元訪問,基類的私有成員仍然是私有的。
下面列出三種不同的繼承方式的基類特性和派生類特性。
public protected private
共有繼承 public protected 不可見
私有繼承 private private 不可見
保護繼承 protected protected 不可見
在上圖中:1)基類成員對派生類都是:共有和保護的成員是可見的,私有的的成員是不可見的。
2)基類成員對派生類的物件來說:要看基類的成員在派生類中變成了什麼型別的成員。如:私有繼承時,基類的共有成員和私有成員都變成了派生類中的私有成員,因此對於派生類中的物件來說基類的共有成員和私有成員就是不可見的。
為了進一步理解三種不同的繼承方式在其成員的可見性方面的區別,下面從三種不同角度進行討論。
對於公有繼承方式
(1) 基類成員對其物件的可見性:
公有成員可見,其他不可見。這裡保護成員同於私有成員。
(2) 基類成員對派生類的可見性:
公有成員和保護成員可見,而私有成員不可見。這裡保護成員同於公有成員。
(3) 基類成員對派生類物件的可見性:
公有成員可見,其他成員不可見。
所以,在公有繼承時,派生類的物件可以訪問基類中的公有成員;派生類的成員函式可以訪問基類中的公有成員和保護成員。這裡,一定要區分清楚派生類的物件和派生類中的成員函式對基類的訪問是不同的。
對於私有繼承方式
(1) 基類成員對其物件的可見性:
公有成員可見,其他成員不可見。
(2) 基類成員對派生類的可見性:
公有成員和保護成員是可見的,而私有成員是不可見的。
(3) 基類成員對派生類物件的可見性:
所有成員都是不可見的。
所以,在私有繼承時,基類的成員只能由直接派生類訪問,而無法再往下繼承。
對於保護繼承方式
這種繼承方式與私有繼承方式的情況相同。兩者的區別僅在於對派生類的成員而言,對基類成員有不同的可見性。
上述所說的可見性也就是可訪問性。
關於可訪問性還有另的一種說法。這種規則中,稱派生類的物件對基類訪問為水平訪問,稱派生類的派生類對基類的訪問為垂直訪問。
看看這樣的例子:
#include<iostream>
using namespace std;
//////////////////////////////////////////////////////////////////////////
class A //父類
{
private:
int privatedateA;
protected:
int protecteddateA;
public:
int publicdateA;
};
//////////////////////////////////////////////////////////////////////////
class B :public A //基類A的派生類B(共有繼承)
{
public:
void funct()
{
int b;
b=privatedateA; //error:基類中私有成員在派生類中是不可見的
b=protecteddateA; //ok:基類的保護成員在派生類中為保護成員
b=publicdateA; //ok:基類的公共成員在派生類中為公共成員
}
};
//////////////////////////////////////////////////////////////////////////
class C :private A //基類A的派生類C(私有繼承)
{
public:
void funct()
{
int c;
c=privatedateA; //error:基類中私有成員在派生類中是不可見的
c=protecteddateA; //ok:基類的保護成員在派生類中為私有成員
c=publicdateA; //ok:基類的公共成員在派生類中為私有成員
}
};
//////////////////////////////////////////////////////////////////////////
class D :protected A //基類A的派生類D(保護繼承)
{
public:
void funct()
{
int d;
d=privatedateA; //error:基類中私有成員在派生類中是不可見的
d=protecteddateA; //ok:基類的保護成員在派生類中為保護成員
d=publicdateA; //ok:基類的公共成員在派生類中為保護成員
}
};
//////////////////////////////////////////////////////////////////////////
int main()
{
int a;
B objB;
a=objB.privatedateA; //error:基類中私有成員在派生類中是不可見的,對物件不可見
a=objB.protecteddateA; //error:基類的保護成員在派生類中為保護成員,對物件不可見
a=objB.publicdateA; //ok:基類的公共成員在派生類中為公共成員,對物件可見
C objC;
a=objC.privatedateA; //error:基類中私有成員在派生類中是不可見的,對物件不可見
a=objC.protecteddateA; //error:基類的保護成員在派生類中為私有成員,對物件不可見
a=objC.publicdateA; //error:基類的公共成員在派生類中為私有成員,對物件不可見
D objD;
a=objD.privatedateA; //error:基類中私有成員在派生類中是不可見的,對物件不可見
a=objD.protecteddateA; //error:基類的保護成員在派生類中為保護成員,對物件不可見
a=objD.publicdateA; //error:基類的公共成員在派生類中為保護成員,對物件不可見
return 0;
}
相關文章
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- 【C++基礎】公有,私有和受保護的繼承C++繼承
- 公有繼承、私有繼承和保護繼承之間的對比繼承
- C++繼承詳解:共有(public)繼承,私有(private)繼承,保護(protected)繼承C++繼承
- C++ 公用、私有和受保護的繼承C++繼承
- C++繼承一之公有繼承C++繼承
- C++繼承C++繼承
- C++ | 類繼承C++繼承
- C++菱形繼承C++繼承
- 區塊鏈安全如何保證?公有私有哪家強?區塊鏈
- C++繼承體系C++繼承
- C++中的繼承C++繼承
- [C++]繼承和派生類C++繼承
- C++虛繼承的概念C++繼承
- 說說C++多重繼承C++繼承
- c++ 虛繼承詳解C++繼承
- c++ 記憶體 繼承C++記憶體繼承
- C++ 整理15_繼承C++繼承
- C++ protected繼承意義C++繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- C++高階教程之繼承得本質:單繼承(一)C++繼承
- C++學習筆記——C++ 繼承C++筆記繼承
- c++中的繼承關係C++繼承
- C++多繼承的細節C++繼承
- c++語言中類的私有型別或保護型別成員變數C++型別變數
- 原型,繼承——原型繼承原型繼承
- 菱形繼承,虛繼承繼承
- C++的核心特性:繼承機制C++繼承
- c++繼承,隱藏(重定義)C++繼承
- 【c++基礎】菱形繼承問題C++繼承
- Effective C++:物件導向與繼承C++物件繼承
- [c++] 繼承和多型整理二C++繼承多型
- C++繼承時的修飾符C++繼承
- 私有setter公有getter屬性
- ORACLE公有/私有同義詞Oracle
- 深刻理解php“繼承“、“私有屬性“、“$this指向“的關係PHP繼承
- 多繼承 與 多重繼承繼承
- 『無為則無心』Python物件導向 — 55、多層繼承和繼承中的私有成員Python物件繼承