Effecitve 阅读笔记--private继承与组合

来源:互联网 发布:前端工程师知乎 编辑:程序博客网 时间:2024/05/17 06:22

Effective 条款38和39都是关于has a关系的讨论.
1.private继承则是其中的一种has a 关系. .private继承的语义是implements-in-terms-of. 如果你让一个类private继承另外一个类,你的用意是为了采用父类一些已有的实现,不是因为两个类在任何观念上的关系.private继承纯粹只是一种实现技术,(这就是为什么继承自一个private base会把base class中的所有东西都丢到parivate中去,因为他们仅仅是实现的细枝末节不需要用户知道).private 继承意味着实现被继承,而丢掉了借口部分.
2.尽量以public继承加上组合来代替private继承.

#include <iostream>#include <unistd.h>using namespace std;class Timer{    public:        explicit Timer(int tickFre):tick_(tickFre),running_(false){                  }        virtual void onTick() const{            cout<<"i am triggered"<<endl;        }        void start(){            cout<<"the timer is started"<<endl;            running_  = true;            while(1){                sleep(tick_);                onTick();                if(!running_)                    break;            }        }        void stop(){            running_ =false;        }    private:        bool running_;        int  tick_;};class Widget{    public:        Widget(int tickFre):timer(tickFre){        }        void WidgetStart(){            timer.start();        }    private:        class WidgetTimer:public Timer{            public:            explicit WidgetTimer(int fre):Timer(fre){};            virtual void onTick() const{                cout<<"widget triggered"<<endl;            }        };        WidgetTimer timer;};int main(){    Widget w(5);    w.WidgetStart();}

当然也可以使用private 继承来完成,书中给出了不使用private继承 而使用public继承加上组合来代替的原因,
但如果需要override的函数位于Timer的protected 中,那么只能够使用private继承来完成.

原创粉丝点击