1. 程式人生 > >C++ 公有(public)繼承,私有(private)繼承,保護(protected)繼承

C++ 公有(public)繼承,私有(private)繼承,保護(protected)繼承

公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。
1. 公有繼承(public)
公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。
2. 私有繼承(private)
私有繼承的特點是基類的公有成員和保護成員都作為派生類的私有成員,並且不能被這個派生類的子類所訪問。
3. 保護繼承(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++ 公有(public)繼承私有(private)繼承保護(protected)繼承

公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。 1. 公有繼承(public) 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被

c/c++再學習:C++中public、protect、private的訪問權限控制

namespace 大小 protect pub UNC 派生類 ret int 不變 C++中public、protect、private的訪問權限控制 訪問權限 一個類的public成員變量、成員函數,可以通過類的成員函數、類的實例變量進行訪問 一個類的protecte

C++中類的三種繼承方式public公有繼承)、protected保護繼承)、private私有繼承)之間的差別(附思維導圖)【轉】

(轉自:https://blog.csdn.net/coco56/article/details/80467975) 注:若不指明繼承方式,則預設是私有繼承。 一:對於公有繼承(public)方式: 基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的p

C++繼承公有私有保護(轉)

情況 pre mes 派生類 它的 保持 ++ col ble 公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。 1. 公有繼承(public) 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持

c++ 多繼承 公有私有保護

  昨天學習三種繼承方式,有些比喻十分形象,特此分享。 首先說明幾個術語: 1.基類 基類比起它的繼承類是個更加抽象的概念,所描述的範圍更大。所以可以看到有些抽象類,他們設計出來就是作為基類所存在的(有些名字裡面有abstract的)。 基類也叫父類,雖然本人覺得這個比喻並不恰當。因為實際

C# 類私有公有屬性繼承

class BaseFile { //欄位、屬性、建構函式、函式、索引器 //私有欄位 private string _filePath; public string FilePath //快捷鍵 ctrl+R+E { get { return _file

C++繼承公有私有保護

公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。 1. 公有繼承(public) 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。 2. 私有繼承(

C++繼承公有私有保護

公有繼承(public)、私有繼承(private)、保護繼承(protected)是常用的三種繼承方式。 1. 公有繼承(public) 公有繼承的特點是基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類

C++公有繼承保護繼承私有繼承的區別

1.公有繼承–public 公有繼承時,對基類的公有成員和保護成員的訪問屬性不變,派生類的新增成員可以訪問基類的公有成員和保護成員

C++的public繼承中的publicprivateprotected

    C++語言是對C語言的一種增強,而其主要貢獻在於,為C語言增加了類和模板等功能,可以幫助實現面對物件程式設計和程式碼複用等更方便的功能。     在C++語言的類,一般都包含兩種成員,分別是成員變數和成員函式。成員變數可以用來表示該類的某些狀態,而成員函式則可以用來

公有繼承私有繼承保護繼承的區別

一個子類繼承父類時,可按照public、private和protected方式繼承父類,每種繼承方式的區別如下: 1) public繼承方式 基類中所有public成員在派生類中為public屬性;基類中所有protected成員在派生類中為protected屬性;基類

c++公有繼承保護繼承私有繼承

C++中的繼承方式有:public、private、protected三種(它們直接影響到派生類的成員、及其物件對基類成員訪問的規則)。(1)public(公有繼承):繼承時保持基類中各成員屬性不變,並且基類中private成員被隱藏。派生類的成員只能訪問基類中的publi

C語言拾遺:公有私有和受保護繼承--《C++ primer》筆記

公有繼承:派生類物件可訪問基類中的公有成員,派生類成員可訪問基類中的公有成員與保護成員。私有繼承:對於派生類物件不可該問基類任何成員。派生類成員可該問基類公有與保護成員。所有基類公有與保護成員變成派生類私有成員,且不可為派生類的子類訪問。基類私有成員對派生類不可見。保護繼

關於公有繼承保護繼承私有繼承

假設現在有一個名叫大地主的類,他有下面三個成員:公有成員:一塊空地保護成員:傳家寶私有成員:QQ號所謂公有成員,就是你可以和大地主商量,讓他把空地租給你,對外說的時候,你要說清楚你這個地是大地主的一塊空地,也就是:大地主.一塊空地傳家寶當然是只給其後代(派生類)的,其他人要用

C++中publicprotectedprivate用法 以及各種繼承方式的影響 (二)

在學習C++時經常會混淆public、protected、private在繼承中的概念,於是寫在此部落格加深理解。  首先記住以下三點: 使用者程式碼(類外)只能訪問public成員變數和public成員函式。 子類(繼承類)能訪問基類的public和protected

C++ 公有繼承保護繼承私有繼承的區別

1)基類成員對派生類的可見性 1. 公有繼承(public) :基類的公有成員和保護成員作為派生類的成員時,它們都保持原有的狀態,而基類的私有成員仍然是私有的,不能被這個派生類的子類所訪問。 2. 私有繼承(private) :基類的公有成員和保護成員都作為派生類的私有

C++ 繼承 3--私有派生下的子類訪問父類公有私有保護成員

#include <iostream> using namespace std; /*--------------------------------- 10私有派生 ---------------------------------*/ class

公有私有和受保護繼承--《C++ primer》筆記

protectedInheritance.cpp 間接繼承和書本描述不一致,書上說因為第一重繼承變private,第二重繼承才無法訪問Base::i~是private,現實是提示Base::i是protected,好像跳過Private_derived類直接找基類了。 繼

JavaSE8基礎 不同包下的子類中創建子類對象可以繼承到父類的 受保護/公有方法

cas jdk .sh imp java png pack ges pre os :windows7 x64 jdk:jdk-8u131-windows-x64 ide:Eclipse Oxygen Release (4.7.0) 代碼: 

C++之共有繼承保護繼承私有繼承

nbsp inf ima int void 不能 stream cout turn 1.封裝,public,private作用就是這個目的。   類外只能訪問public成員而不能方位private成員;   private成員只能被類成員和友元訪問; 2.繼承,prote