Re: [問題] 不繼承特定成員的方法?

看板C_and_CPP作者 (A士一對)時間15年前 (2010/07/09 00:00), 編輯推噓1(1015)
留言16則, 3人參與, 最新討論串2/2 (看更多)
剛好最近看的書上有提到一個類似原PO問題的解法 所以就回這篇跟大家討論看看... ※ 引述《icetofux ()》之銘言: : 遇到的問題: (題意請描述清楚) : 我先建立一個類別A: : class A : { : public: : Sub1(); : Sub2(); : Sub3(); : }; : 然後在建立一個類別B繼承自類別A: : class B : public A : { : ... : }; 這裡改成 class B: private A { public: using A::Sub1; } : 照理說類別B會繼承到類別A的成員Sub1()、Sub2()、Sub3(),但我希望在使用類別B時, : 不該使用到Sub2(),請問除了記在腦袋裡使用類別B時不要去用到成員Sub2(),有沒有辦 : 法從語法下手,讓我在程式編寫的過程中,如果使用到類別B的Sub2()成員時跳出錯誤訊 : 息? : 希望得到的正確結果: : 類別B不繼承類別A的特定成員。 : 程式跑出來的錯誤結果: : 還不知道要怎麼寫所以還沒錯。 : 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) : Code::Blocks / Windows : 有問題的code: (請善用置底文標色功能) : 還不知道要怎麼寫所以還沒有code。 : 補充說明: : 沒有。 這樣對於class B的使用者而言,只看的到Sub1() 而且也可以宣告為virtual使用多型. 至於缺點是使用private繼承失去轉型的能力 例如: 不能A *a = new B(); 或是 B* b = new B(); A *a = dynamic_cast<A*>(b); 想請問這樣的方式還有其他優缺點嗎? 或者有其他更好得解法可以達到原po問題 的要求? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.85.208.21

07/09 03:59, , 1F
原 po 問題沒描述清楚就跑了,所以很難判斷他想幹嘛。
07/09 03:59, 1F

07/09 03:59, , 2F
但是從他沒宣告 virtual function 來看,我猜他不打算以
07/09 03:59, 2F

07/09 04:00, , 3F
多型的方式去使用 B。所以前面我直接建議他在 B 裡面把
07/09 04:00, 3F

07/09 04:01, , 4F
Sub2() 丟到 private: 下就好。
07/09 04:01, 4F

07/09 10:00, , 5F
我沒有跑啊,因為沒有人提出問題描述不清楚,所以我就沒
07/09 10:00, 5F

07/09 10:00, , 6F
多解釋了,我要用的地方是這樣的:
07/09 10:00, 6F

07/09 10:02, , 7F
我用WIN32 API寫視窗程式,把BUTTON、TEXT、COMBOBOX等
07/09 10:02, 7F

07/09 10:02, , 8F
元件作成物件,然後因為都有長、寬、座標等相同性質的
07/09 10:02, 8F

07/09 10:03, , 9F
東西,所以我先以這些東西為基礎建立一個類別,再繼承這
07/09 10:03, 9F

07/09 10:04, , 10F
基礎類別去製作各個元件類別,但是某些元件不會有特定的
07/09 10:04, 10F

07/09 10:04, , 11F
屬性,所以我才會提出"不繼承特定成員"的疑問。
07/09 10:04, 11F

07/09 12:48, , 12F
那你要再多建一層物件階層 而不是用這種方法惡搞
07/09 12:48, 12F

07/09 21:01, , 13F
「再繼承這基礎類別去製作各個元件類別」
07/09 21:01, 13F

07/09 21:01, , 14F
這不就是 is-implement-in-terms-of?
07/09 21:01, 14F

07/09 21:02, , 15F
用 private 繼承或合成應該都 ok 吧。
07/09 21:02, 15F

07/09 21:03, , 16F
這兩種方法都不會把介面繼承上來,所以沒你擔心的問題。
07/09 21:03, 16F
文章代碼(AID): #1CDVONA6 (C_and_CPP)
文章代碼(AID): #1CDVONA6 (C_and_CPP)