22.C++- 繼承與組合,protected訪問級別

来源:https://www.cnblogs.com/lifexy/archive/2018/04/02/8698104.html
-Advertisement-
Play Games

在C++里,通過繼承和組合實現了代碼復用,使得開發效率提高,並且能夠通過代碼看到事物的關係 組合比繼承簡單,所以在寫代碼時先考慮能否組合,再來考慮繼承. 組合的特點 將其它類的對象作為當前類的成員使用 比如主機類,擁有 CPU/主板/記憶體/硬碟這4個對象成員,而這4個對象成員並沒有繼承主機類的特性和 ...


在C++里,通過繼承和組合實現了代碼復用,使得開發效率提高,並且能夠通過代碼看到事物的關係

組合比繼承簡單,所以在寫代碼時先考慮能否組合,再來考慮繼承.


 

組合的特點

  • 其它類的對象作為當前類的成員使用

比如主機類,擁有 CPU/主板/記憶體/硬碟這4個對象成員,而這4個對象成員並沒有繼承主機類的特性和行為

繼承的特點

  • 新的類(子類)具有舊的類(父類)的屬性和行為
  • 舊的類被稱為父類,也叫基類
  • 新的類被稱為子類,也叫派生類(一個派生類也可以繼承多個基類)
  • 子類可以添加新的屬性和行為(成員變數和成員函數),也可以重寫已有的屬性和行為
  • 一個子類只繼承一個父類,便被稱為單繼承
  • 一個子類若繼承多個父類,便被稱為多繼承
  • 子類其實就是一個特殊的父類,比如:蘋果手機是手機,就是將蘋果手機當做一個特殊的父類對待

子類對象可以初始化父類對象,也可以賦值給父類對象,比如:

class Parent
{
       int mValue;
public:    
       Parent()
       {
              mValue=10;
       }  
       int Value()
       {
              return mValue;
       } 
};

class Child : public Parent
{
public:    
        Child()
       {
              cout<<"I'm child"<<endl;
       }
};

int main()
{
       Child c;
cout
<< c.Value() <<endl; //調用父類的成員函數 Parent p1 =c;    //通過子類初始化父類 Parent p2; p2=c; //通過子類複製給父類 }

 

 

類的訪問級別之protected

大家都知道,類里private修飾的成員和函數,不能被外界直接訪問.

雖然子類擁有父類的屬性和行為,但是在子類里,也不能訪問父類的private私有成員

比如:

class Parent
{
       int mValue;
public:    
       Parent(int i=0)
       {
              mValue=i;
       }
       int Value()
       {
              return mValue;
       } 
};

class Child : public Parent
{
public:    
        Child()
       {
          cout<<mValue<<endl;         //在子類中,訪問父類的private成員,將會編譯報錯
       }
};

 

所以類的訪問級別引入了新的關鍵字protected

protected的特性

  • 修飾的成員不能被外界直接訪問
  • 修飾的成員可以被子類(包括子類的子類)直接訪問, 也可以在本類內部直接訪問

有了protected的加入,定義類時,我們就需要仔細考慮成員的訪問級別,如下圖所示:

 

 

接下來做個綜合實例,組合與繼承

  • 需要一個父類Object, 為子類Point子類Line 提供name名字和info信息
  • 由於線Line至少需要兩個點Point才能組成,所以Line子類內部需要通過Point子類來組合

如下圖所示:

 

開始寫代碼:

#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
{
protected:
       int x;                     //坐標
       int y;

public:
       Point(int x=0,int y=0)
       {
              ostringstream s;
              this->x =x;
              this->y =y;
              s<<"P("<<x<<","<<y<<")";  //坐標信息
              mName="Point";
              mInfo=s.str();
       } 
};

class Line : public Object
{
private:
       Point mP1;
       Point mP2;
public:
       Line(Point p1,Point p2)
       {
              ostringstream s;
              mP1 =p1;
              mP2 =p2;
              s<<"Line from " <<p1.info() <<" to "<<p2.info();      //線的信息
              mName ="Line";
              mInfo =s.str();
       }
};

int main()
{
       Point p1(2,3); 
       Point p2(6,3);
       Line  L(p1,p2);
/*列印點的信息*/ cout<<p1.name()<<":"<<endl; cout<<p1.info()<<endl; /*列印線的信息*/ cout<<L.name()<<":"<<endl; cout<<L.info()<<endl; return 0; }

 

運行列印:

Point:
P(2,3)

Line:
Line from P(2,3) to P(6,3)

 

接下來來學習: 23.C++- 繼承的多種方式、顯示調用父類構造函數、父子之間的同名函數、虛函數

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 學習目的: 掌握爬蟲相關的基本概念 正式步驟 Step1:什麼是爬蟲 請求網站並提取數據的自動化程式 Step2:爬蟲的基本流程 Step3:Request和Response 1.request 2.response Step4:能抓怎樣的數據 Step5:怎麼樣來解析 Step6:怎樣保存數據 學 ...
  • HTML 1、一套規則,瀏覽器認識的規則。 2、開發者: 學習Html規則 開發後臺程式: - 寫Html文件(充當模板的作用) ****** - 資料庫獲取數據,然後替換到html文件的指定位置(Web框架) 3、本地測試 - 找到文件路徑,直接瀏覽器打開 - pycharm打開測試 4、編寫Ht ...
  • 本文主要介紹iReport軟體生成報表模板使用Jasper進行數據填充並生成pdf文檔的實現過程。 ...
  • 練習題 python 1、整理函數相關知識點,寫博客 2、寫函數,檢查獲取傳入列表或元組對象的所有奇數位索引對應的元素, 並將其作為新列表返回給調用者。 def odd_index(l): lis = [] for i in range(len(l)): 通過range設定索引範圍比通過元素找索引要 ...
  • 【基本的文件操作】 參數: 1、文件路徑; 2、編碼方式; 3、執行動作;(打開方式)只讀,只寫,追加,讀寫,寫讀! ...
  • 第一次作業 第一作業的主要難度在於判斷字元串的格式。在寫C語言代碼時發現,如果輸出格式錯在哪裡內容非常多,導致C語言雖然沒有仔細debug,但依然寫了好久。java使用正則表達式後可以簡化很多,但輸出錯在哪裡要增加的內容更多,所以只是對錯誤簡單地進行分類輸出。 正則表達式相關的類由Matcher和P ...
  • 創建動態Web工程打war包 ​ 創建動態Web工程打war包 ​ 創建動態Web工程打war包 ​ File→new→Maven Project→勾上create a simple project→然後next> ​ File→new→Maven Project→勾上create a simple ...
  • 對python中集合的理解 集合是一個無序的,不重覆的數據組合,它的主要作用如下: 去重,把一個列表變成集合,就自動去重了 關係測試,測試兩組數據之前的交集、差集、並集等關係 常用操作 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...