作者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
1F:推 littleshan:You got it! 10/28 16:10
2F:→ littleshan:protected 的目的就是「不让外界用,但要给儿子用」 10/28 16:11
3F:→ littleshan:不管这个关键字出现在哪,它的概念都是一样的 10/28 16:11