c++中的繼承關系
1 什麼是繼承
繼承概念
繼承(inheritance)機制是面向對象程序設計使代碼可以復用的最重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能。這樣產生新的類,稱派生類。繼承呈現瞭面向對象程序設計的層次結構,體現瞭由簡單到復雜的認知過程。
面向對象的繼承關系指類之間的父子關系。用類圖表示如下:
2 為什麼要有繼承?/ 繼承的意義?
因為繼承是面向對象中代碼復用的一種手段。通過繼承,可以獲取父類的所有功能,也可以在子類中重寫父類已有的功能 以及 添加父類中沒有的功能。
3如何理解 子類是特殊的父類?
因為子類不僅繼承瞭父類所有的屬性與行為,而且在子類中還可以重寫父類已有的功能,以及添加自己的新屬性與新方法。這也就是說子類對象可以當作父類對象使用。
4 繼承的規則
1) 子類是特殊的父類
2) 子類對象可以直接初始化父類對象
3) 子類對象可以直接賦值給父類對象
5 繼承中的訪問級別
1)public:在類的內部和外部都可以訪問。
2)protected::可以在類的內部使用,不可以在類的外部直接使用。,但是存在繼承關系時,可以在子類中使用父類的protected的成員。
3)private:隻可以在類的內部使用,不可以在類的外部使用。
註:類的內部:在當前類的作用域中(不包括子類的作用域);類的外部:類內部之外的作用域(包括子類的作用域)
問題1:子類是否可以直接訪問父類中的private成員(非公有成員)嗎?(No)
1)從面向對象理論的角度分析,可知子類擁有父類一切的屬性與行為,得出的結論:Yes
2)從c++的語法角度分析,可知外界不能訪問類的private成員,得出的結論:No
問題2:談談 protected關鍵字的存在的意義?
protected關鍵字是為繼承而存在的,這樣就可以在子類中訪問父類的protected成員,同時還不允許外界直接訪問父類中的protected成員。
問題3:在類中如何選擇類的訪問級別?— 見下圖
6 繼承中的繼承方式
1)public 繼承方式 — 父類成員在子類中保持原有的訪問級別。
2)protected繼承方式 —父類中的公有成員在子類中變成瞭protected成員,其它不變。
3)private 繼承方式(默認) — 父類成員在子類中變成瞭private成員
可歸納為:
結論:無論選擇哪種繼承方式,都不會影響子類訪問父類成員的級別
註:1) c++ 工程項目中隻使用 public 繼承方式;
2) c++ 派生語言(jave,c#)隻支持 public繼承方式;
3)protected、private 繼承方式帶來的復雜性遠大於其實用性;(舍棄不用)
用代碼實現類圖中的功能:
代碼如下:
#include <iostream> #include <string> #include <sstream> using namespace std; class Object { protected: string mName; string mInfo; public: Object() { mName = "Object"; mInfo = ""; } inline string getName() { return mName; } inline string getInfo() { return mInfo; } }; class Point : public Object { private: int mX; int mY; public: Point(int x = 0, int y = 0) { ostringstream oss; mX = x; mY = y; mName = "Point"; oss << "Point(" << mX << ", " << mY << ")"; mInfo = oss.str(); } inline int getX() { return mX; } inline int getY() { return mY; } }; class Line : public Object { private: Point mP1; Point mP2; public: Line(Point p1, Point p2) { mP1 = p1; mP2 = p2; mName = "Line"; mInfo = "Line from " + p1.getInfo() + " to " + p2.getInfo(); } inline Point getStartPoint() { return mP1; } inline Point getEndPoint() { return mP2; } }; int main(int argc, char const *argv[]) { Object obj; cout << obj.getName() << endl; cout << obj.getInfo() << endl << endl; Point p1(1, 2); Point p2(3, 4); cout << p1.getName() << endl; cout << p1.getInfo() << endl; cout << p2.getName() << endl; cout << p2.getInfo() << endl << endl; Line line(p1, p2); cout << line.getName() << endl; cout << line.getInfo() << endl << endl; return 0; }
到此這篇關於c++中的繼承關系的文章就介紹到這瞭,更多相關c++繼承關系內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!