c++中的繼承關(guān)系
1 什么是繼承
繼承概念
繼承(inheritance)機制是面向?qū)ο蟪绦蛟O(shè)計使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進行擴展,增加功能。這樣產(chǎn)生新的類,稱派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計的層次結(jié)構(gòu),體現(xiàn)了由簡單到復(fù)雜的認知過程。
面向?qū)ο蟮睦^承關(guān)系指類之間的父子關(guān)系。用類圖表示如下:

2 為什么要有繼承?/ 繼承的意義?
因為繼承是面向?qū)ο笾写a復(fù)用的一種手段。通過繼承,可以獲取父類的所有功能,也可以在子類中重寫父類已有的功能 以及 添加父類中沒有的功能。
3如何理解 子類是特殊的父類?
因為子類不僅繼承了父類所有的屬性與行為,而且在子類中還可以重寫父類已有的功能,以及添加自己的新屬性與新方法。這也就是說子類對象可以當作父類對象使用。
4 繼承的規(guī)則
1) 子類是特殊的父類
2) 子類對象可以直接初始化父類對象
3) 子類對象可以直接賦值給父類對象
5 繼承中的訪問級別
1)public:在類的內(nèi)部和外部都可以訪問。
2)protected::可以在類的內(nèi)部使用,不可以在類的外部直接使用。,但是存在繼承關(guān)系時,可以在子類中使用父類的protected的成員。
3)private:只可以在類的內(nèi)部使用,不可以在類的外部使用。
注:類的內(nèi)部:在當前類的作用域中(不包括子類的作用域);類的外部:類內(nèi)部之外的作用域(包括子類的作用域)
問題1:子類是否可以直接訪問父類中的private成員(非公有成員)嗎?(No)
1)從面向?qū)ο罄碚摰慕嵌确治?,可知子類擁有父類一切的屬性與行為,得出的結(jié)論:Yes
2)從c++的語法角度分析,可知外界不能訪問類的private成員,得出的結(jié)論:No
問題2:談?wù)?protected關(guān)鍵字的存在的意義?
protected關(guān)鍵字是為繼承而存在的,這樣就可以在子類中訪問父類的protected成員,同時還不允許外界直接訪問父類中的protected成員。
問題3:在類中如何選擇類的訪問級別?--- 見下圖

6 繼承中的繼承方式
1)public 繼承方式 --- 父類成員在子類中保持原有的訪問級別。
2)protected繼承方式 ---父類中的公有成員在子類中變成了protected成員,其它不變。
3)private 繼承方式(默認) --- 父類成員在子類中變成了private成員
可歸納為:

結(jié)論:無論選擇哪種繼承方式,都不會影響子類訪問父類成員的級別
注:1) c++ 工程項目中只使用 public 繼承方式;
2) c++ 派生語言(jave,c#)只支持 public繼承方式;
3)protected、private 繼承方式帶來的復(fù)雜性遠大于其實用性;(舍棄不用)
用代碼實現(xiàn)類圖中的功能:

代碼如下:
#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;
}
到此這篇關(guān)于c++中的繼承關(guān)系的文章就介紹到這了,更多相關(guān)c++繼承關(guān)系內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VScode配置cuda開發(fā)環(huán)境的實現(xiàn)步驟
本文主要介紹了VScode配置cuda開發(fā)環(huán)境的實現(xiàn)步驟,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-07-07
C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點
工廠方法模式是一個創(chuàng)建型設(shè)計模式,通過定義一個創(chuàng)建對象的接口,讓其子類決定實例化哪一個工廠類,這篇文章主要給大家介紹了關(guān)于C++設(shè)計模式之工廠方法模式的實現(xiàn)及優(yōu)缺點,需要的朋友可以參考下2021-06-06
C++實現(xiàn)LeetCode(347.前K個高頻元素)
這篇文章主要介紹了C++實現(xiàn)LeetCode(347.前K個高頻元素),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字)
這篇文章主要介紹了C++實現(xiàn)LeetCode(12.整數(shù)轉(zhuǎn)化成羅馬數(shù)字),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-07-07

