2-4 繼承


阿瑟 發表



繼承 (inheritance) 讓你可以先一個類別中衍生出更多的類別, 不必再重複寫同樣的程式碼.

*注意: C++所有語法大小寫有差. 如果您在執行時發現中文無法顯示請自行將程式修改成英文.

*注意: 如果您執行程式後, 程式視窗會自動關閉的話, 請至MS-DOS模式重新執行程式, 或是在void main()最底端加上system("PAUSE");來暫停程式.



講到了類別, 當然也不能夠略過 繼承 (inheritance). 之前小弟之前討論的範例都是樹狀的 , 如企業類別與商店類別.

假設今天您是要設計多個代表房車的類別, 每個類別代表一個品牌的房車, 那應該怎麼寫呢? 車子同樣都有方向盤, 輪子, 如果要建立每個品牌的房車, 代表方向盤和輪子之類的共通項目就需要被重複輸入, 這不但很沒有效率而且也費時.

今天要介紹的繼承, 可以讓你先建立一個共通的類別, 然後讓新的類別繼承共通類別的特性, 然後再做細部修改.

來看看這個範例:

#include <iostream.h>
#include <stdlib.h>

class car //通用的房車類別
{
   protected:
   int count_wheels; //紀錄這個物件有幾個輪子 (房車應該都是4個輪子吧)

   public:
   car(); // 這是初始函式, 會設定車子的輪子數量為4
};

class mercedes : car
{
   private:
   int price; //價格

   public:
   mercedes(); // 這是初始函式, 會設定這台賓士房車的價格與輪子數量
   void output(); // 此函式會列出Mercedes房車的基本資料
};


class honda : car
{
   private:
   int price; //價格

   public:
   honda(); // 這是初始函式, 會設定這台Honda房車的價格與輪子數量
   void output(); // 此函式會列出Honda房車的基本資料
};


car::car()
{
   count_wheels = 4;
}


mercedes::mercedes()
{
   price = 2000000;
}


void mercedes::output()
{
   cout << "-------------------------" << endl;
   cout << "Mercedes高級房車 - 新款報價" << endl;
   cout << "-------------------------" << endl;
   cout << "輪子:" << count_wheels << endl;
   cout << "售價;" << price << "新台幣" << endl;
   cout << "-------------------------" << endl;
}


honda::honda()
{
   price = 700000;
}


void honda::output()
{
   cout << "-------------------------" << endl;
   cout << "Honda房車 - 新款報價" << endl;
   cout << "-------------------------" << endl;
   cout << "輪子:" << count_wheels << endl;
   cout << "售價;" << price << "新台幣" << endl;
   cout << "-------------------------" << endl;
}

void main()
{
   honda car1;
   mercedes car2;
   
   car1.output();
   car2.output();

   system("PAUSE");

}  


Car類別本身是一個通用的類別, 代表的是一台基本的車子 (四顆輪子).

而 mercedes 和 honda 兩個類別會繼承car的成員 (例: class mercedes : car). 因此 mercedes 與 honda 兩個類別建造物件都是四個輪子的車子 (count_wheels = 4). 簡單的說就是 mercedes 和 honda 除了自身的成員以外還會包涵 car 類別的成員, 這就是繼承的概念.

在範例中您應該發現了新的存取權限保留字 protected: , 也就是保護狀態的意思, 這種特殊的狀態在繼承中常常用到. 如果在這個範例中以 私有 去界定 car 的變數, 那 honda 與 mercedes 兩個由 car 類別繼承出來的新類別將無法存取變數. 保護狀態 (protected) 有點類似public:和private:的綜合體, protected:下的成員本身不對外界物件公開, 但對繼承的類別與物件公開. 因此通用類別中的成員如果要讓繼承的類別能夠存取變數, 您必須將變數放在 public: 或是 protected: 下.

最後更新日期: 6/6/2004 4:22:54 PM