看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 和學弟討論繼承概念的時候 我亂想了一些case 測試 : 發現一些觀念的錯誤但又不太會解釋 : 1. 原本以為static data member 寫在private public裡面其實沒差 : 都不屬於class本身 <======這件事我是用 : (class A ;加上一個static int p; sizeof(A); 和去掉static int p在印出sizeof(A) : 大小一樣,我認為他不屬於class本身.....) : 所以外部都還是可以透過class name::去存取他 : 但是我發現我錯了 寫在private 外部無法用::去存取他 : 但是可以定義 <====這件事很怪 外面看不到卻可以定義? 你要稍微修正一下 static data member 的意義 static data member 是指這個 class 的所有 object 所共有的一個屬性值 因此 第一 既然是共有 自然不會在各個 object instance 裡出現 第二 既然是一個 class 裡只會有一份 那只好使用 class name:: 去存取 那麼 定成 public/private 的差別就在於這個屬性值我要不要其他人看到 總是會有一些屬性值內部需要用 全部只要一份 但不想給外面看的 這些就會是 private static member : 2. private方式繼承老爸 可是變成老爸的東西我完全無法呼叫 : 那繼承幹嘛??? 有什麼用意......... 不是我無法呼叫 而是外面不能透過我去呼叫老爸的東西 例如: class A { public: void f(){} }; class B : private a { public: void g(){f();} }; 那在其他地方如果有一個 B b; 則 b.g(); 是OK的 但 b.f(); 是不行的 (順帶一提, 似乎是為了防止 polymorphism 呼叫的關係, 此例中 B* 到 A* 的轉換似乎是不會允許的...) 用意也許是想在父 class 之外提供一些功能 但因為父 class 有些功能可能影響我的工作 於是只好把繼承來的父 class 的 method 設成 private : 3.另外我自己對protected 作的白話解釋 : 你要給兒子 : 就只好寫成protected : 兒子就多了老爸的protected的東西 : protected 要用也是要透過 member function : 對老爸來講 其實也是private的行為 只是多了可以給兒子繼承這個特性 : 以上有錯誤嘛? 大致是正確的 : 4.有個不解的地方是 老爸的private資料明明就繼承給兒子 : 兒子看的到卻不能用 頂多透過 老爸的function去修改數值 : 然後要get時 再透過老爸的get function去get... : 這樣為啥不直接老爸就寫成protected就好 : 有沒有什麼case是老爸必定要寫private 不然會有什麼漏洞或是什麼問題產生? 我的東西我不想給兒子亂動 (因為我有我的東西的擺放規則) 但我希望我兒子可以拿去參考 那麼我只好要求兒子想要時要來找我拿 (getter) 想改時也要我看一下 (setter) 才准改 : 以上四點 是我和學弟討論遇到的小小問題 : 請各位指教 : 謝謝 -- 実琴:「河野!你真的就這樣被物質慾望給吸引過去了嗎?!」 亨:「只要穿著女裝擺出親切的樣子,所有必要花費就能全免,似乎一點都不壞啊。」 実琴:「難道你沒有男人的尊嚴了嗎?!」 亨:(斷然道)「沒有。在節衣縮食生活吃緊學生面前,沒有那種東西。」 --プリンセス・プリンセス 第二話 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.84
QQ29:L大我對於2. 想問 如果f()寫在private 為啥就不能透過g呼叫了 10/28 04:03
QQ29:我認知是 private繼承 所有老爸的東西都會壓成private 10/28 04:04
QQ29:所以都不能用?原本是這樣認為但是似乎原本老爸是public 10/28 04:05
QQ29:或是老爸本身是protected的話 private繼承後 兒子要存取的行 10/28 04:05
QQ29:為都是要變成 L大舉的 利用g去呼叫f... 10/28 04:05