看板 C_and_CPP 關於我們 聯絡資訊
剛好最近看的書上有提到一個類似原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
tinlans:原 po 問題沒描述清楚就跑了,所以很難判斷他想幹嘛。 07/09 03:59
tinlans:但是從他沒宣告 virtual function 來看,我猜他不打算以 07/09 03:59
tinlans:多型的方式去使用 B。所以前面我直接建議他在 B 裡面把 07/09 04:00
tinlans:Sub2() 丟到 private: 下就好。 07/09 04:01
icetofux:我沒有跑啊,因為沒有人提出問題描述不清楚,所以我就沒 07/09 10:00
icetofux:多解釋了,我要用的地方是這樣的: 07/09 10:00
icetofux:我用WIN32 API寫視窗程式,把BUTTON、TEXT、COMBOBOX等 07/09 10:02
icetofux:元件作成物件,然後因為都有長、寬、座標等相同性質的 07/09 10:02
icetofux:東西,所以我先以這些東西為基礎建立一個類別,再繼承這 07/09 10:03
icetofux:基礎類別去製作各個元件類別,但是某些元件不會有特定的 07/09 10:04
icetofux:屬性,所以我才會提出"不繼承特定成員"的疑問。 07/09 10:04
littleshan:那你要再多建一層物件階層 而不是用這種方法惡搞 07/09 12:48
tinlans:「再繼承這基礎類別去製作各個元件類別」 07/09 21:01
tinlans:這不就是 is-implement-in-terms-of? 07/09 21:01
tinlans:用 private 繼承或合成應該都 ok 吧。 07/09 21:02
tinlans:這兩種方法都不會把介面繼承上來,所以沒你擔心的問題。 07/09 21:03