码迷,mamicode.com
首页 > 编程语言 > 详细

C++进阶--代码复用 继承vs组合

时间:2018-12-25 23:43:49      阅读:326      评论:0      收藏:0      [点我收藏+]

标签:成员   ++   --   绑定   调用   man   运行时   代码结构   virt   

//############################################################################
/*
 * 代码复用: 继承 vs 组合
 */

//继承实现代码复用
class BaseDog {
   ...
   ... // 公共的操作
};

class BullDog : public BaseDog {
   ... // 调用公共操作,执行更多任务
};

class ShepherdDog : public BaseDog {
   ... // 调用公共操作,执行更多任务
};




// 组合实现代码复用

class ActivityManager {
   ... // 公共操作
};

class Dog {
   ...
};

class BullDog : public Dog {
   ActivityManager* pActMngr;  
   ... //  通过pActMngr调用公共操作
};

class ShepherdDog : public Dog {
   ActivityManager* pActMngr;
   ... // 通过pActMngr调用公共操作
};




/*
 * 代码复用: 组合优于继承
 *
 * 1. 复用者和被复用者之间具有更少的代码耦合
 *    a. 子类自动继承父类所有的公有成员
 *    b. 子类可以访问父类的保护成员
 *       - 继承破坏了封装性
 */

/*
 * 2. 动态绑定
 *    a. 继承在编译时绑定
 *    b. 组合可以在编译时绑定,也可以在运行时绑定
 */

class OutdoorActivityManager : public ActivityManager {...}

class IndoorActivityManager : public ActivityManager {...}


/*
 * 3. 灵活的代码结构
 *
 *    Dog             ActivityManager
 *
 *    BullDog         OutdoorActivityManager
 *    ShepherdDog     IndoorActivityManager
 *    ...             ...
 */


// 组合的例子:只从纯虚类继承
class ActivityManager {
   void eatBiscuit() { ... }
};

class Dog {
   ...
   virtual void eatBiscuit() = 0;
};

class BullDog : public Dog {
   ActivityManager* pActMngr;
   ...
   void eatBiscuit() { pActMngr->eatBiscuit(); }
};

class ShepherdDog : public Dog {
   ActivityManager* pActMngr;
   ... 
   void eatBiscuit() { pActMngr->eatBiscuit(); }
};

C++进阶--代码复用 继承vs组合

标签:成员   ++   --   绑定   调用   man   运行时   代码结构   virt   

原文地址:https://www.cnblogs.com/logchen/p/10176901.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!