作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題Re: [問題] class繼承問題 請教
時間Wed Oct 28 14:57:26 2009
※ 引述《littleshan (我要加入劍道社!)》之銘言:
: ※ 引述《QQ29 (我愛阿蓉)》之銘言:
謝謝l大的解說 不過請容我再對以下提出一些問題....
: 比如說以下的 code
: class Base {
: public:
: void foo();
: };
: class Derived : private Base {
: public:
: void bar()
: {
: foo(); // 呼叫 Base::foo()
: }
: };
: compiler 會把它轉成這個樣子...
: class Derived {
: private:
: Base base_;
: public:
: void bar()
: {
: base_.foo();
: }
: };
: 也就是說呢
: private 繼承其實不過就是在子類別中
: 放入一個父類別的物件
: 並且把它設定為 private
: 而 protected 繼承也是一樣的:在子類別中加一個父類別的物件
: 並且設定為 protected
: 不過在使用 private/protected 繼承時
: compiler 動了一點小手腳
: 使得子類別可以呼叫父類別的 protected 成員函式
: (如果你不用繼承而是自己加一個物件 是無法呼叫 protected 函式的)
: 這是使用 private/protected 繼承
: 與「直接包一個物件進來」的不同之處
: 那麼 private/protected 繼承要用在什麼時候?
: 其實大部份的情況下 private/protected 繼承都可以用物件包物件的方法來取代
若是以兒子來看
protected繼承 就l大所講的 其實多了一個protected: Base base_;
base_.能夠存取的範圍 就老爸的protected 和public
private繼承 多了個 private: Base base_;
base_.能去存取的範圍 就也是老爸的protected和public
所以對兒子 能夠存取的行為來講 要用老爸的 都還是要兒子自己member function
間接的去存取老爸
所以我自認為 對兒子來講 這兩種繼承方式 造成兒子 一樣的權限
差別在於 如果這兒子有了孫子(public繼承兒子)
孫子還是可以"多"得到 兒子(protected繼承後 多產生的Base base_:)
讓孫子可以去呼叫 super class...
若兒子是用private繼承
孫子得到的Base base_ 是private的..... 所以他根本始用不了
所以就失去 呼叫super class的能力
不知道以上我的結論是否有錯誤
請給予指點
謝謝各位
: (這種寫法也比較容易讓其它人理解 也比較有彈性)
: 但如果你還想呼叫 protected member function
: 那就必須要繼承了
: 請參考 Effective C++ 還有 Exceptional C++
: 這兩本書都有談到 private 繼承
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.207.187
推 littleshan:You got it! 10/28 16:10
→ littleshan:protected 的目的就是「不讓外界用,但要給兒子用」 10/28 16:11
→ littleshan:不管這個關鍵字出現在哪,它的概念都是一樣的 10/28 16:11