看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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