積分 1107
最後登入 1970-1-1
閱讀權限 100
積分 1107
帖子
精華
升級
100%
本貼最後由 fonghi 於 2010-1-9 19:55 編輯
C++與物件導向程式計概念簡介
作者:魏天君(清華大學) d908301@oz.nthu.edu.tw
主述內容:繼承關係
重新繕打:fonghi
繼承
。直覺上(生物的例子)
.小貓像母貓
.小狗像母狗
.子類別(subclass)像超類別(superclass)
.衍生類別(droved class)像基礎類別(base class)
。目的
.程式碼的可重用性
..基礎類別有的衍生類別可以直接拿來用
....幼鳥和母鳥一樣是用鳥喙啄東西吃
..衍生類別可以改寫基礎類別有的涵式
....幼鳥經演化會有不同的鳥喙
繼承 VS. 使用(一)
。繼承:是( is-a )
.小雞 是 一隻 雞
.F-16 是 一架 戰鬥噴射機
..是一架 噴射機 件 是一架 飛機
。使用:有( has-a )
.小雞 有一身的 羽毛
.F-16 有 響尾蛇飛彈
..響尾蛇飛彈 是 短程空對空飛彈 (繼承)
..響尾蛇飛彈 有 彈頭 (使用)
.......... 有 引擎 (使用)
繼承 VS. 使用(二) 。例如:時薪員工 與 月薪員工 都是一種 員工
..小劉 是一位 時薪員工 同時也是一位 員工
..老張 是一位 月薪員工 同時也是一位 員工
。例如:蘋果園 與 蘋果樹 與 樹
..公孫蘋果園 是多顆 蘋果樹?
....有多顆 蘋果樹 ? 件 比較自然
......蘋果園 使用 蘋果樹 這個物件
..蘋果園 是一顆 樹 ? 件 比較自然
......蘋果園 繼承 蘋果樹 這個物件
繼承 VS. 使用(三)
。James Rumbaugh:
..只要每一個 subclass 的 instance 從各方面看起來,都是它的 superclass 的 instance,那就不會是錯誤的繼承關係了
存取等級控制
。目的是資訊隱藏,不讓不相平的 其他class 干擾 class 自身的變數與成員函數
。private
..私有的,只供自己這種 class 使用
..其他 class 無法使用
..元件如無宣告,預設是 private
。public
..公用的,可供其他 class 使用
。protected
..保護的,可供自己這種 class 使用
..以及供自己的衍生類別使用
..對類別外部而言,protected 的行為與 private 相同
C++中如何繼承?(一~三)
。B是類別,A繼承自B
class B{
private:
int x;
protected:
int y;
public:
int z;
};
class A: B {
....//A 的元件
};
若:
class A: public B {
....//A 的元件
};
..對 A 而言:
.... x:可繼承不可存取
.... y:protected int
.... z:publice int
若:
class A: protected B {
....//A 的元件
};
..對 A 而言:
.... x:可繼承不可存取
.... y:protected int
.... z:protected int
若:
class A: private B {
....//A 的元件
};
..對 A 而言:
.... x:可繼承不可存取
.... y:private int
.... z:private int
成員函式的取代與增加
。衍生類別增加成員函式
..直接加上就好
。衍生類別取代基礎類別的成員函式
..把基礎類別的成員函式 蓋掉
..靜態取代
......較簡單,直接再宣告一個和基礎類別一樣的成員函式
..動態取代
......較複雜,必須使用"虛擬"才能完成
。衍生類別改良基礎類別的成員函式
..使用 overloading
......相同的成員函式名稱,不同的參數
C++多重繼承
。A 繼承自 B1和B2
class A: public B1 , public B2
{
//A的內容
};
C++ 多重繼承的問題(一)
。使用"虛擬" 來解決重複的問題
..例如:B1、B2 都繼承自 Point
..則A有兩份 Point ;但是 A 只需要一份
......解法一:
........A改寫對 Point 的使用函式,使得兩份 Point 的值必定是一樣的
......解決二:
........B1和B2 繼承 Point 時使用" virtual "
C++ 多重繼承的問題(二)
class B1 : virtual public Point
{
//B1 的內容
};
class B2 : virtual public Point
{
//B2 的內容
};
class A : public B1, public B2
{
//A 只有一份 Point
};
繼承的解構子
。繼承關係的解構子依照與建構子相反的順序呼叫
。上面的例子
.. A 先
.. B1, B2 其次
.. Point 最後
於網路發現此篇幻燈片,共15張,應為清華大學教授之講稿大綱,認為不錯,所以依其內容重新繕抄一份。
樓主熱門主題