1. 程式人生 > >C++繼承和派生(初學)

C++繼承和派生(初學)

繼續學習C++,學習到繼承和派生

定義:

類的繼承,是新的類從已有類那裡得到已有的特性。或從已有類產生新類的過程就是類的派生。原有的類稱為基類或父類,產生的新類稱為派生類或子類。

派生與繼承,是同一種意義兩種稱謂。(繼承相當於“子承父業”,而派生相當於“父親派生出了一個兒子”,兩者的角度不同,本質一樣)

下例就是一個繼承:

//C++通過繼承關係,實現了程式碼的可重用性

class Human                            //父類:體現的是共性
{ 
    public: 
        void eat(string food)
        {
            cout<<"i am eating "<<food<<endl;
        }
};
class Student : public Human   //子類:是在父類的基礎上增加新的功能,體現的是個性
{
  public:
        void study(string course)
        {
            cout<<"i am learning "<<course<<endl;
        }
};

對於is-a

is-a是一種屬於關係,如:狗屬於一種動物,車屬於一種交通工具(Dog is an Animal. Car is a Vehicle.)在面向物件中表現為一種繼承關係。可以設計一個Animal類,Dog類作為 Animal類(基類)的派生類;設計一個Vehicle類,Car類作為Vehicle類(基類)的派生類。

has-a是一種包含、組合關係。如:車包含方向盤、輪胎、發動機(Car has steering-wheel,wheels,engine),但不能說方向盤/輪胎/發動機是一種車;正確的應該說車聚合(包含)了方向盤、輪胎、發動機。

因此,如果A是(is a)B,則B是A的基類,A是B的派生類。為繼承關係。

如果A包含B,則B是A的組成部分。為聚合關係,可以由組成部分聚合成為一個類。

 語法

class  派生類名:[繼承方式] 基類名    //[繼承方式]這裡有括號,說明是可以省略的,若寫成 class  派生類名:[] 基類名
{                                                        //則表示  class  派生類名:[private] 基類名
   派生類成員宣告;
};                                                       //注意分號

重新看下面例子

class Human
{
    public:
        void eat(string food)
        {
            cout<<"i am eating "<<food<<endl;
        }
};
class Student : public Human                    
//這裡的public表示的是繼承方式   若把public省略就是預設private
{
  public:                                                      //這裡的public表示的是訪問許可權
        void study(string course)
        {
            cout<<"i am learning "<<course<<endl;
        }
};

繼承方式

繼承方式規定了如何訪問基類繼承的成員。繼承方式有public,private,protected。繼承方式不影響派生類的訪問許可權,影響了從基類繼承來的成員的訪問許可權包括派生類內的訪問許可權和派生類物件。

分為三大類:

公有繼承:基類的公有成員和保護成員在派生類中保持原有訪問屬性,其私有成員仍為基類的私有成員。
私有繼承:基類的公有成員和保護成員在派生類中成了私有成員,其私有成員仍為基類的私有成員。

保護繼承:基類的公有成員和保護成員在派生類中成了保護成員,其私有成員仍為基類的私有成員。

保護繼承(protected)對於外界訪問屬性來說,等同於私有,但可以派生類中可見。