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