1. 程式人生 > >C++進階--公有繼承的二元性

C++進階--公有繼承的二元性

tin 保護 中繼 增加 pub 鼓勵 phi nco 關註

//###########################################################################
/* 
 * 公有繼承的兩元性
 *
 *   - 接口的繼承
 *   - 實現的繼承
 */

class Dog {
   public:
      virtual void bark() = 0;      //只繼承了接口
      void run() { cout << "I am running."; }   //既繼承了接口,也繼承了實現
      virtual void eat() { cout << "I am eating. "; }
   protected:
      void sleep() { cout << " I am sleeping. "; }  //只繼承了實現,沒繼承接口
};

class Yellowdog : public Dog{
   public:
      virtual void bark() { cout << "I am a yellow dog.\n";}
      void iSleep() { sleep(); }
};


/*
 * C++中繼承的類型:
 * 1. 純虛公有函數 - 只繼承接口
 * 2. 非虛公有函數 - 繼承接口和實現
 * 3. 非純虛公有函數 - 繼承接口和默認實現
 * 4. 保護函數 - 只繼承實現
 *
 * 作為程序設計師,有必要分清接口和實現的概念
 */




/*
 * 接口繼承用於
 *
 * 1. Subtyping
 * 2. Polymorphism
 */
  virtual void bark() = 0;

/*
 * 陷阱:
 *  -- 小心接口膨脹
 *  -- 接口不應該顯示實現
 */


/*
 * 實現繼承
 *    - 會增加代碼的復雜性  //在寫派生類的時候需要關註基類,在改基類的時候的還要時刻小心有沒有破壞派生類
 *    - 不鼓勵Not encouraged
 */
public:
   void run() { cout << "I am running."; }
   virtual void eat() { cout << "I am eating. "; }
protected:
   void sleep() { cout << " I am sleeping. "; }

/*
 * 實現繼承的指導原則:
 * 1. 不要為了代碼重用而使用繼承,使用組合替代
 * 2. 最小化基類的實現,基類要小巧
 * 3. 最小化實現繼承的層數
 */



/* 
 * 繼承是否是魔鬼 ???
 * 
 * 繼承有時候有用,但是往往過度使用了
 */

C++進階--公有繼承的二元性