plague0

導航

統計

第四次作業

一、 類的繼承與派生基本概念

 

  1.  概念:(繼承和派生是同一過程從不同角度看)

 

      ①  繼承:是新的類從已有類那里得到已有的特性。

      ②  派生:從已有類的基礎上新增自己的特性而產生新類的過程。

 

  2.

    被繼承的已有類成為基類(或父類);

    派生出的新類成為派生類(或子類);

    直接參與派生出某類的基類稱為直接基類

    基類的基類甚至更高層的基類稱為間接基類。(多級派生,生成類族)

 

  3.  目的:

 

      ①  繼承的目的:實現設計與代碼的重用;

      ②  派生的目的:當新的問題出現,原有程序無法解決(或不能完全解決時),需要對原有程序進行改造。

 

  4. 

    多繼承:一個派生類,可以同時有多個基類;

    單繼承:一個派生類只有一個直接基類。

 

     

①  單繼承時派生類的定義:(代碼)

  語法:

      class 派生類名:繼承方式 基類名

      {

        成員說明;

      };

 eg:

1 class Derived :public Base
2 {
3 public:
4     Derived();
5     ~Derived();
6 };

 

②  多繼承時派生類的定義:(代碼)

   語法:

      class 派生類名:繼承方式1 基類名1,繼承方式2 基類名2,...

      {

                 成員說明;

      };

 

注意:每一個“繼承方式”,只用于限制對緊隨其后之基類的繼承。

eg:

1 class Derived :public Base1,private Base2
2 {
3 public:
4     Derived();
5     ~Derived();
6 };

 

   5.  繼承方式

    ①  繼承方式關鍵字:

        

        public(公有繼承)、protected(保護繼承)、private(私有繼承);

 

    ②  繼承方式規定了如何訪問從基類繼承的成員;

 

        ·基類公有成員=派生類公有成員,即派生類可以像訪問自身的公有成員一樣訪問基類的公有成員;

        ·基類保護成員=派生類保護成員,即派生類可以像訪問自己的保護成員一樣訪問基類的保護成員;

        ·基類私有成員:派生類的內部成員無法直接訪問。派生類的使用者也無法通過派生類對象直接訪問基類的私有成員。

   總結:

      派生類不能直接使用基類私有成員;

      派生類可以直接使用基類公有/保護成員;

 

    ③  如果不顯式地給出繼承方式關鍵字,系統的默認值就認為是私有繼承private);

 

  6.  派生類成員是指除了從基類繼承來的所有成員之外,新增加的數據和函數成員。

 

二、 派生類的生成過程

 

  1.  步驟:吸收基類成員、改造基類成員、添加新的成員。

 

    (1)  吸收基類成員:

 

        ①  默認情況下派生類包含了全部基類中除構造函數和析構函數之外的所有成員;

        ②  C++11規定可以用using語句繼承基類構造函數;

        ③  在定義派生類之后自動完成。

 

    (2)  改造基類成員:

 

        ①  包括兩個方面:基類成員的訪問控制問題、對基類數據或函數成員的覆蓋和隱藏;

        ②  如果派生類聲明了一個和某基類成員同名的新成員(如果是成員函數,則參數表也要相同,參數不同的情況屬于重載),派生的新成員就隱藏了外層同名成員。

           這時在派生類中或者通過派生類的對象,直接使用成員名就只能訪問到派生類中聲明的同名成員,叫做同名隱藏。

 

    (3)  添加新的成員:

 

        ①  需要在派生類中加入新的構造和析構函數。

 

 

三、 3種繼承方式

 

  ·包括:public(公有繼承)、protected(保護繼承)、private(私有繼承);

 

  ·不同繼承方式的影響主要體現在:

 

      ①  派生類成員對基類成員的訪問權限;

      ②  通過派生類對象對基類成員的訪問權限。

 

 

  1.  公有繼承(最寬泛、最常用的一種繼承)

 

    ·  基類的publicprotected成員:訪問屬性在派生類中保持不變;

    ·  基類的private成員:不可直接訪問

 

  ▲訪問權限:

   

    ·  派生類中的成員函數:可以直接訪問基類中的publicprotected成員,但不能直接訪問基類的private成員;

    ·  通過派生類的對象:只能訪問派生類的public成員(包括繼承的public成員)。

 

舉例說明(代碼如下):

 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Base
 5 {
 6 public:
 7     Base(int nId) { mId = nId; }
 8     int Id() { mId++; cout << mId << endl; return mId; }
 9 protected:
10     int Num() { cout << 0 << endl; return 0; }
11 private:
12     int mId;
13 };
14 
15 class Child : public Base
16 {
17 public:
18     Child() : Base(7) { ; }
19     int newId() { return Id(); }    //新增成員可以訪問公有成員
20     int newNum() { return Num(); }  //新增成員可以訪問保護成員
21                                       //無法訪問基類的私有成員
22 protected:
23     int y;
24 private:
25     int x;
26 };
27 
28 int main()
29 {
30     Child child;
31     child.Id();        //派生類的對象可以訪問派生類繼承下來的公有成員
32     //child.GetNum();     //無法訪問繼承下來的保護成員Num()
33     child.newId();
34     child.newNum();      //派生類對象可以訪問派生類的公有成員
35     //child.x;
36     //child.y;            //無法訪問派生類的保護成員y和私有成員x
37     return 0;
38 }

 

 

  2.  私有繼承(最嚴格的一種繼承;很少使用)

 

    ·  基類的publicprotected成員:都以private身份出現在派生類中;

    ·  基類的private成員:不可直接訪問

 

  ▲訪問權限:

 

    ·  派生類中的成員函數:可以直接訪問基類中的publicprotected成員,但不能直接訪問基類的private成員;

    ·  通過派生類的對象:不能直接訪問從基類繼承的任何成員。

 

舉例說明(代碼如下):

 1 class Child : private Base
 2 {
 3 public:
 4     Child() : Base(7) { ; }
 5     int newId() { return Id(); }   //可以訪問基類的公有成員和保護成員
 6     int newNum() { return Num(); }
 7 protected:
 8     int y;
 9 private:
10     int x;
11 };
12 
13 int main()
14 {
15     Child child;
16     //child.Id();//派生類對象訪問不了繼承的公有成員,因為此時私有繼承時newId()已經為private類型
17     //child.Num(); //派生類對象訪問不了繼承的保護成員,而且此時私有繼承時newNum()已經為private類型
18     child.newId();
19     child.newNum();
20     return 0;
21 }

  

 

  3.  保護繼承(介于公有和私有之間)

 

    ·  基類的publicprotected成員:都以protected身份出現在派生類中;

    ·  基類的private成員:不可直接訪問

 

  ▲訪問權限:

 

    ·  派生類中的成員函數:可以直接訪問基類中的publicprotected成員,但不能直接訪問基類的private成員;

    ·  通過派生類的對象:不能直接訪問從基類繼承的任何成員。

 

舉例說明(代碼如下):

 1 class Child : protected Base
 2 {
 3 public:
 4     Child() : Base(7) { ; }
 5     int newId() { return Id(); }   //可以訪問基類的公有成員和保護成員
 6     int newNum() { return Num(); }
 7 protected:
 8     int y;
 9 private:
10     int x;
11 };
12 
13 int main()
14 {
15     Child child;
16     //child.Id();//派生類對象訪問不了繼承的公有成員,因為此時保護繼承時Id()已經為protected類型
17     //child.Num(); //這個也訪問不了
18     child.newId();
19     child.newNum();
20     return 0;
21 }

 

 

注:protected成員的特點與作用

 

    ①  對建立其所在類對象的模塊來說,它與private成員的性質相同。絕不可能被其他外部使用者(比如程序中的普通函數、與其類平行的其他類)等訪問。

    ②  對于其派生類來說,它與public成員的性質相同。

    ③  既實現了數據隱藏,又方便繼承,實現代碼重用。

 

 

舉例說明(代碼如下):

 1 class A {
 2 protected:
 3         int x;
 4 };
 5 class B :public A {      //公有派生
 6     public 7         void function();
 8 };
 9 void B::function() {
10     x = 5;
11 }

 

 注:如果B是A的派生類,B的成員函數只能通過B的對象訪問A中定義的protected成員,而不能通過A的對象訪問A的protected成員。

 

★總結:

      不管是哪種繼承方式,派生類中新增成員可以訪問基類的公有成員和保護成員,無法訪問私有成員。而繼承方式影響的是派生類繼承成員訪問屬性,而使用友元(friend)可以訪問保護成員和私有成員

 

 

 

posted on 2019-10-12 10:07  plague0  閱讀(45)  評論(0編輯  收藏

七乐彩2011年走势图南方双彩