看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《QQ29 (我愛阿蓉)》之銘言: : 你好L大 針對這問題我有個盲點 : http://0rz.tw/9d2H8 之前看那種有個繼承表格 或是這網頁 : 他竟然寫老爸private的話就不繼承了 : 不過我認為他寫錯了 : 因為我不管怎麼樣改老爸的 sizeof(兒子) 大小都不變 : 應該都有繼承到 : 但是盲點在於 : L大這例子b.g() 可以呼叫到f() : 那要是f()改為 private之下變成無法呼叫 : 而之前看資料 有那個繼承表 : 原本老爸public 透過private繼承 會壓成 private : 和原本 老爸private 透過private繼承 也是壓成 private : 但這裡說的private 似乎對於兒子來講 一個可用一個不可用....... : 讓我非常的疑惑 嗯 許多 C++ 的教學書籍都會寫這個表格 但這個表格呢 其實是很容易誤導人的 而且它完全沒有寫出 private/protected 繼承的目的 private 繼承和 protected 繼承的原理 其實非常簡單 比如說以下的 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 member function 那就必須要繼承了 請參考 Effective C++ 還有 Exceptional C++ 這兩本書都有談到 private 繼承 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.29.108
twotwoone:寫得很好,推。 10/28 10:28
VictorTom:再推:) 10/28 10:50
legnaleurc:is-a 和 is-implemented-in-terms-of 的差別吧 10/28 14:29