C++筆記 第四十四課 繼承中的訪問級別---狄泰學院
阿新 • • 發佈:2018-11-28
如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。
學習C++編譯環境:Linux
第四十四課 繼承中的訪問級別
1.值得思考的問題
子類是否可以直接訪問父類的私有成員?可以,protected關鍵字替換private即可
2.思考過程
根據面向物件理論:
根據C++語法:
44-1 繼承中的訪問級別—此程式有報錯—如何訪問父類中的非公有成員?
#include <iostream> #include <string> using namespace std; class Parent { private: int mv; public: Parent() { mv = 100; } int value() { return mv; } }; class Child : public Parent { public: int addValue(int v) { mv = mv + v; // How to access non-public members in a parent class? } }; int main() { return 0; }
3.繼承中的訪問級別
面向物件中的訪問級別不只是public和private
可以定義protected訪問級別
關鍵字protected的意義
修飾的成員不能被外界直接訪問
修飾的成員可以被子類直接訪問
44-2 protected初體驗
#include <iostream> #include <string> using namespace std; class Parent { protected: int mv; public: Parent() { mv = 100; } int value() { return mv; } }; class Child : public Parent { public: int addValue(int v) { mv = mv + v; } }; int main() { Parent p; cout << "p.mv = " << p.value() << endl; // p.mv = 1000; // error Child c; cout << "c.mv = " << c.value() << endl; c.addValue(50); cout << "c.mv = " << c.value() << endl; // c.mv = 10000; // error return 0; } 執行結果 p.mv = 100 c.mv = 100 c.mv = 150
4.思考
為什麼面向物件中需要protected?
5.定義類時訪問級別的選擇
6.組合與繼承的綜合示例
44-3 綜合例項
#include <iostream> #include <string> #include <sstream> using namespace std; class Object { protected: string mName; string mInfo; public: Object() { mName = "Object"; mInfo = ""; } string name() { return mName; } string info() { return mInfo; } }; class Point : public Object { private: int mX; int mY; public: Point(int x = 0, int y = 0) { ostringstream s; mX = x; mY = y; mName = "Point"; s << "P(" << mX << ", " << mY << ")"; mInfo = s.str(); } int x() { return mX; } int y() { return mY; } }; class Line : public Object { private: Point mP1; Point mP2; public: Line(Point p1, Point p2) { ostringstream s;//格式化 mP1 = p1; mP2 = p2; mName = "Line"; s << "Line from " << mP1.info() << " to " << mP2.info(); mInfo = s.str(); } Point begin() { return mP1; } Point end() { return mP2; } }; int main() { Object o; Point p(1, 2); Point pn(5, 6); Line l(p, pn); cout << o.name() << endl; cout << o.info() << endl; cout << endl; cout << p.name() << endl; cout << p.info() << endl; cout << endl; cout << l.name() << endl; cout << l.info() << endl; return 0; } 執行結果 Object Point P(1, 2) Line Line from P(1, 2) to P(5, 6)
小結
面向物件中的訪問級別不只是public和private
protected修飾的成員不能被外界所訪問
protected使得子類能夠訪問父類的成員
protected關鍵字是為了繼承而專門設計的
沒有protected就無法完成真正意義上的程式碼複用