[問題] 關於繼承的問題

看板C_and_CPP作者 (Maxiwill)時間15年前 (2010/03/21 04:10), 編輯推噓1(104)
留言5則, 3人參與, 最新討論串6/7 (看更多)
( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) ( 未必需要依照此格式,文章條理清楚即可 ) 遇到的問題: (題意請描述清楚) 是這樣的, 假如我要用 C++ 撰寫一個程式, 來代表... 任何一個動物, 可以有任何的能力 那, 假設我是這樣定義 class 的 : class animal class dog : public animal class cat : public animal class rat : public animal class ability class fly : public ability class walk : public ability class eat : public ability 那我應該怎麼樣定義 animal 和 ability 的關係 ? 如果我要在 runtime 動態的把 ability 加裝到 animal 上 我該怎麼做 ? 我的想法是 animal HAS-A ability 亦即 : class ability; class animal { private: ability * p_ability[MAX_ABILITIES]; }; 但是假設我定義了一個 ability class attack : public ability 這樣 ability 會存取到 animal 吧 ? 這樣就會有問題了吧 ? 怎麼樣讓 ability 能夠也去動到 animal class ? class animal { private: ability * P_abilities[MAX_ABILITIES]; }; 如果說要用 forward declaration, 像這樣 : class animal; class ability { private: animal * target; }; class animal { private: ability * p_ability[MAX_ABILITIES]; }; 雖然說這樣會 work, 但如果 ability 和 animal 分開在不同的 header 檔裡面的話 compiler 就會要求我要定義清楚 class 的名稱 ( 意思就是 compiler 找不到兩個 class ) 這樣我該怎麼辦 @@ 我想要把 animal, 和 class 寫在不同的標頭檔裡面, 而且標頭檔裡面不要 include 另一個標頭檔 我該怎麼做 ? 請各位前輩大大們解惑 XD 我找這相關的資料找兩個禮拜有了 = = 設計模式也有看了... @@ 希望得到的正確結果: 程式跑出來的錯誤結果: 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) 有問題的code: (請善用置底文標色功能) 補充說明: -- 命運硬要踩,但我拒絕死掉 我就是小強 小強是我的命 但其實交配繁殖子孫無限才是重點 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.125.46.244 ※ 編輯: maxiwill 來自: 59.125.46.244 (03/21 12:14)

03/21 22:25, , 1F
?不是就animal裡面放 fly/walk/eat這些virtual func即可?
03/21 22:25, 1F

03/21 22:28, , 2F
這跟design pattern的策略模式有關
03/21 22:28, 2F

03/21 22:29, , 3F
為了在執行時期改變行為, 這樣做會比較有彈性
03/21 22:29, 3F

03/21 22:32, , 4F
ability比較像interface,而animal是implementation
03/21 22:32, 4F

03/21 23:51, , 5F
state pattern
03/21 23:51, 5F
文章代碼(AID): #1BfPn8bj (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1BfPn8bj (C_and_CPP)