C++繼承詳解:共有(public)繼承,私人(private)繼承,保護(protected)繼承

來源:互聯網
上載者:User

公有繼承(public)、私人繼承(private)、保護繼承(protected)是常用的三種繼承方式。

1. 公有繼承(public)

公有繼承的特點是基類的公有成員和保護成員作為衍生類別的成員時,它們都保持原有的狀態,而基類的私人成員仍然是私人的,不能被這個衍生類別的子類所訪問。

2. 私人繼承(private)

私人繼承的特點是基類的公有成員和保護成員都作為衍生類別的私人成員,並且不能被這個衍生類別的子類所訪問。

3. 保護繼承(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;
}

原文地址: http://www.cnblogs.com/qlwy/archive/2011/08/25/2153584.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.