1. 程式人生 > >繼承之繼承方式的區別

繼承之繼承方式的區別

(1) 公有派生
(2) 私有派生                                                                                     

(3) 保護派生 

 


這兩種派生方式的特點如下 :
【1】、 無論哪種派生方式 , 基類中的私有成員既不允許外部函式訪問 , 也不允許派生類
中的成員函式訪問 , 但是可以通過基類提供的公有成員函式訪問。

【2】、 公有派生與私有派生的不同點在於基類中的公有成員在派生類中的訪問屬性。
·公有派生時 , 基類中的所有公有成員在派生類中也都是公有的

·私有派生時 , 基類中的所有公有成員只能成為派生類中的私有成員。
下面我們分別討論私有派生和公有派生的一些特性。

總結:在公有派生情況下 , 基類中所有成員的訪問特性在派生類中維持不變 ; 在私有派生情況下 , 基類中所有成員在派生類中成為私有成員

1 . 私有派生
【1
私有派生類對基類成員的訪問
由私有派生得到的派生類 , 對它的基類的公有成員只能是私有繼承。也就是說基類的所有公有成員都只能成為私有派生類的私有成員 ,這些私有成員能夠被派生類的成員函式訪問,但是基類私有成員不能被派生類成員函式訪問。

【2】外部函式對私有派生類繼承來的成員的訪問的私有派生時 , 基類的公有成員在派生類中都成為私有成員 , 外部函式不能訪問。 

2、公有派生
在公有派生中 , 基類中的私有成員不允許外部函式和派生類中的成員函式直接訪問 ,但是可以通過基類提供的公有成員函式訪問。 基類中的公有成員在派生類中仍是公有成員 , 外部函式和派生類中的成員函式可直接訪問。


 

保護成員的作用 

在前面講過 , 無論私有派生還是公有派生 , 派生類無權訪問它的基類的私有成員 ,派
生類要想使用基類的私有成員 , 只能通過呼叫基類的成員函式的方式實現 , 也就是使用基
類所提供的介面來實現。 這種方式對於要頻繁訪問基類私有成員的派生類而言 , 使用起
來非常不便 , 每次訪問都需要進行函 數呼叫。實際上 , 為了讓派生類訪問基類的私有成
員, C + + 還提供了具有另一種訪問屬性的成員— — —protected 成員 , 這種成員稱為保護成員。

      保護成員可以被派生類的成員函式訪問 , 但是對於外界是隱藏起來的(這點類似私有成員) , 外部函式不能
訪問它。 因此 , 為了便於派生類的訪問 , 可以將基類私有成員中需要提供給派生類訪問的成員定義為保護成員

#include <iostream>

using namespace std;

class base
{
protected://保護成員
    int a, b;  
public://公有成員
    void setab(int n, int m)
        {
            a = n;
            b = m;
        }
};

class derive : public base
{
    
private:
    int c;
public:
    void setc(int n)
    {
        c = n;
    }
void showabc()
{
    cout<< a<< b<< c <<endl;// 允許派生類成員函式 訪問保護成員 a 和 b
} 

};
main ( )
{
derive obj;
//obj.a=3  //非法,保護成員不能通過派生類的外部函式訪問
obj .setab( 2, 4) ;
obj .setc( 3) ;
obj .showabc( ) ;
return 0 ;
}

結果: