若在寫程式時,需定義多個類別(比如類別A、B、C、D、E),而類別B、C、D、E擁有類別A的某些成員、或某些成員函式,
若在定義類別B、C、D、E都把這些成員、成員函式定義進去,會浪費程式碼空間。因此,此時就可以使用繼承(inherit )的方法。
說明如下:
若B類別繼承(inherit )A類別,則稱A類別為基礎類別,B類別為衍生類別。做圖為:
衍生類別B因為繼承了基礎類別A,故擁有基礎類別A的某些類別成員。
繼承的程式碼為:
class A{//類別內容};
class B : 繼承方法 A{};
以上的繼承方法可以是public,protected,private。說明如下:
繼承(inheritance)的方式有三種:
※ 公共繼承,如下程式碼(最常用的繼承方法):
class B: public A{ //類別內容 };
表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。
且衍生類別(B)把基礎類別(A) 放在protected區域的資料放在自己(B)的protected區域,把基礎類別(A) 放在public區域的資料放在自己(B)的public區域。
※ 保護繼承,如下程式碼:
class B: protected A{ //類別內容 };
表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。
且衍生類別(B)把基礎類別(A) 放在public, protected區域的資料放在自己(B)的protected區域。
※ 私有繼承,如下程式碼:
class B: private A{ //類別內容 };
表示衍生類別(B)可以存取基礎類別(A) 放在public, protected區域的資料。
且衍生類別(B)把基礎類別(A) 放在public, protected區域的資料放在自己(B)的private區域。
範例如:
class person
{
public:
int age;
string name;
public:
person(int age_, string name_)
{age=age_; name=name_;}
};
class teacher : public person
{
public:
int salary;
public:
teacher (int age_, string name_, int salary_): person(int age_, string name_)
{ salary = salary _; }
};
class student : public person
{
public:
int score;
public:
student(int age_, string name_, int score_): person(int age_, string name_)
{ score = score_; }
};
上例之中,teacher類別和student類別都繼承person類別。
2.
基礎類別和衍生類別是相對關係。相對一類別而言,其「衍層類別」指的是「n階衍生類別(n可以為任意正整數)」;其「基層類別」指的是「n階基礎類別(n可以為任意正整數)」。
若一函數的輸入參數列中,有一參數其資料型態為類別A的物件,則在呼叫函數時,此參數可以輸入任何A類別物件以及A之衍層類別物件。如:
class A
{
public:
A(int a_){a=a_;}
int a;
};
class B: public A //B是A的一階衍生類別,因此也是A的衍層類別
{
public:
B(int a_,int b_):A(a_){a=a_;b=b_;}
private:
int b;
};
class C
{
public:
void print_a(A A1){cout<<A1.a<<endl;}; //此函數的參數是A類別物件
};
A A1(5);
B B1(10,60);
C C1;
C1.print_a(A1); //此函數的參數可以輸入A類別物件。在此顯示5
C1.print_a(B1); //此函數的參數也可以輸入B類別物件。在此顯示10
留言列表