Sean's Note: [C/C++] public/protected/private 繼承

2012年6月16日 星期六

[C/C++] public/protected/private 繼承

class A
{
      public:
      void print() {printf ("print() From class A\n");};
      protected:
      void print2() {printf ("print2() From class A\n");};
      private:
      void print3() {printf ("print3() From class A\n");};
      
};

class PublicB : public A
{
      public:
      int print() {printf ("print() From class B\n"); print2();};  // Redefine
      /* 注意: protected 的 print2() 雖被繼承下來, 但不為外人所用 */
      /* 注意: private 的 print3() 並沒有被繼承下來 */
};

class ProtectedB : protected A
{
      public:
      /* 注意: public 的 print() 雖被繼承下來, 但此時已變為 protected */
      /* 注意: protected 的 print2() 雖被繼承下來, 但不為外人所用 */
      /* 注意: private 的 print3() 並沒有被繼承下來 */
};

class PrivateB : private A
{
      public:
      void myPrint() {print(); print2();};      
      /* 注意: public 的 print() 雖被繼承下來, 但此時已變為 private */
      /* 注意: protected 的 print2() 雖被繼承下來, 但此時已變為 private */
      /* 注意: private 的 print3() 並沒有被繼承下來 */
};

int main()
{
    A clsA;
    clsA.print();
    //clsA.print2(); // Compiler Error! print2() is protected.
    
    PublicB clsB_pub;
    clsB_pub.print();
    //clsB_pub.print2(); // Compiler Error! print2() is protected.
    
    ProtectedB clsB_pro;
    //clsB_pro.print(); // Compiler Error! print() is protected.
    //clsB_pro.print2(); // Compiler Error! print2() is protected.
    
    PrivateB clsB_pri;
    clsB_pri.myPrint();

    system("pause");
}
  1. 首先,繼承的概念是,只有 public 和 protected 的成員函式或變數會被繼承下來,除了建構式 (Constructor)、解構式 (Constructor) 和 Copy Constructor 除外,還有 private 也不會。
    • public: 所有人都能使用。
    • protected: 只有自己和兒子 (Derived Class) 可以使用,外人不能使用。
    • private: 只有自己可以使用, 兒子 (Derived Class) 和外人皆不能使用。
  2. 倘若 B 以 public 方式繼承了 A,則存取修飾字 (Access Specifier) 保持相同,規則同 1。
  3. 倘若 B 以 protected 方式繼承了 A,則 A 的 public 和 protected 成員被以 protected 方式繼承,所以範例中的 Line:48, 49 則發生編譯錯誤,因為  protected 成員不為外人所用。
  4. 倘若 B 以 private 方式繼承了 A,  則 A 的 public 和 protected 成員被以  private 方式繼承 ,僅自身可使用 Line:31。

沒有留言:

張貼留言