請選擇 進入手機版 | 繼續訪問電腦版

微剋多資訊

 找回密碼
 註冊

Login

搜索

簽到天數: 7

該用戶今日未簽到

發表於 2010-1-8 02:11 | 顯示全部樓層 |閱讀模式
本貼最後由 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張,應為清華大學教授之講稿大綱,認為不錯,所以依其內容重新繕抄一份。

簽到天數: 7

該用戶今日未簽到

 樓主| 發表於 2010-3-16 01:13 | 顯示全部樓層
同款性質但是不同物件我們會用繼承,日後維護比較方便,但 ...
cmdunlop 發表於 2010-3-12 15:24


說得沒錯,撰寫程式最大成功在於除錯容易,易於維護這兩項。
所以在撰寫之初即要構思程式的主架構及其延展性。
在維護上應以最小變動為最嚴謹的考量。

若非如此,往後的修訂及除錯,將會是千萬頭緒,花費更多的精神與時間。

使用道具

您需要登入後才可以回帖 登入 | 註冊

本版積分規則

Discuz! X

© 2009-2017 Microduo

快速回覆 返回頂部 返回列表