作者LPH66 ((short)(-15074))
看板C_and_CPP
標題Re: [問題] class繼承問題 請教
時間Wed Oct 28 03:53:28 2009
※ 引述《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