作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] class繼承問題 請教
時間Wed Oct 28 10:20:09 2009
※ 引述《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