this指針 和 類的繼承

一、this指針

  • Human類的屬性fishc與Human()構造器的參數fishc同名,但卻是兩個東西。
  • 使用this指針讓構造器知道哪個是參數,哪個是屬性。

this指針:指向當前的類生成的對象

this -> fishc = fishc

?當前對象(this)的屬性(fishc?)?=? 參數 (fishc?)

現在編譯器就懂了,賦值操作符的左邊將被解釋為當前對象的 fishc 屬性,右邊將被解釋為構造器的傳入來的 fishc 參數。

注意:使用 this 指針的基本原則是:如果代碼不存在二義性隱患,就不必使用 this 指針!?



二、類的繼承

C++ 類的繼承允許一個類(派生類 / 子類)獲取另一個類(基類 / 父類)的屬性和方法,實現代碼復用與擴展。

(1)語法:class 子類名繼承方式 父類名{...}

class Pig:public Animal{...}

?(2)案例

假設我們有一只烏龜和一只豬,它們都有一些共同特征:例如都有嘴巴會吃東西,都睡覺,都看會流口。
當然,它們也有不同的地方:例如烏龜會游泳,豬會爬樹。。。。。。


那么我們就需要編寫一個 Animal 類作為 Turtle類和 Pig 類的基類。
? 基類:?是可以派生出其他的類,也稱為父類或超類。比如這里的 Animal 類是基類。
? 子類:是從基類派生出來的類,比如這里的 Turtle類和 Pig 類是子類。

#include <iostream>
#include <string>//父類 
class Animal
{
public:std::string mouth;void eat(); //方法聲明 void sleep();void drool();
};//子類Pig類 
class Pig : public Animal
{
public:void climb();
};//子類Turtle類 
class Turtle : public Animal
{
public:void swim();
};//方法定義 
void Animal::eat()
{std::cout << "I'm eatting!" << std::endl;
}void Animal::sleep()
{std::cout << "I'm sleeping!Don't disturb me!" << std::endl;
}void Animal::drool()
{std::cout << "我是公的,看到母的我會流口水,我正在流口水。。。" << std::endl;
}void Pig::climb()
{std::cout << "我是一個只漂亮的小母豬豬,我會上樹,我正在爬樹,噓。。。" << std::endl;
}void Turtle::swim()
{std::cout << "我是一只小甲魚,當母豬想抓我的時候,我就游到海里。。哈哈。。" << std::endl;
}int main()
{Pig pig;Turtle turtle;pig.eat();turtle.eat();pig.climb();turtle.swim();return 0;
}

(3)繼承方式(public、private、protected)

  • 公有繼承(public:基類的公有和保護成員在派生類里保持原訪問權限,私有成員不可直接訪問
  • 私有繼承(private:基類的公有和保護成員在派生類中變為私有成員,基類的私有成員在派生類中仍然不可直接被其他類訪問
  • 保護繼承(protected:基類的公有和保護成員在派生類中變為保護成員,基類的私有成員在派生類中不可直接被其他類訪問

鏈接:訪問控制--public、protected、private-CSDN博客?

(4)派生類的構造函數和析構函數 的 執行順序

  • 派生類的構造函數會先調用基類的構造函數,然后再執行自身的構造函數體
  • 析構函數的執行順序則相反,先執行派生類的析構函數,再執行基類的析構函數。
#include <iostream>
#include <string>//父類 
class BaseClass
{
public:BaseClass(); //父類構造器聲明 ~BaseClass();//父類析構函數聲明 void doSomething();//父類函數聲明 
};//子類 
class SubClass : public BaseClass
{
public:SubClass();//子類構造器聲明 ~SubClass();//子類析構函數聲明 
};
//父類構造函數定義 
BaseClass::BaseClass()
{std::cout << "進入基類構造器。。。。。\n";std::cout << "我在基類構造器里邊干了某些事。。。。\n\n";
}
//父類析構函數定義 
BaseClass::~BaseClass()
{std::cout << "進入基類析構器.......\n";std::cout << "我在基類析構器里邊也干了某些事。。。。\n\n";
}
//父類函數聲明 
void BaseClass::doSomething()
{std::cout << "我干了某些事。。。。\n\n";
}
//子類構造函數定義 
SubClass::SubClass()
{std::cout << "進入子類構造器.....\n";std::cout << "我在子類構造器里邊還干了某些事.....\n\n";
}
//子類析構函數定義 
SubClass::~SubClass()
{std::cout << "進入子類析構器......\n";
}int main()
{SubClass subclass;subclass.doSomething();std::cout << "完事,收工!\n";return 0;
}

(5)帶有參數的構造器的繼承?

定義子類構造函數時:

Animal::Animal( std::string theName ){name = theName;
}
Pig::Pig( std::string theName ) : Animal( theName ){
}

#include <iostream>
#include <string>class Animal
{
public:std::string mouth;std::string name;//名字 Animal(std::string theName); //父類有參構造器 聲明 void eat();void sleep();void drool();
};class Pig : public Animal
{
public:void climb();Pig(std::string theName); //Pig子類有參構造器 聲明 
};class Turtle : public Animal
{
public:void swim();Turtle(std::string theName); //Turtle子類有參構造器 
};
//父類有參構造函數定義 
Animal::Animal(std::string theName)
{name = theName;
}void Animal::eat()
{std::cout << "I'm eatting!" << std::endl;
}void Animal::sleep()
{std::cout << "I'm sleeping!Don't disturb me!" << std::endl;
}void Animal::drool()
{std::cout << "我是公的,看到母的我會流口水,我正在流口水。。。" << std::endl;
}
//Pig子類有參構造函數定義 
Pig::Pig(std::string theName) : Animal(theName)  //重點!!! 
{
}void Pig::climb()
{std::cout << "我是一個只漂亮的小母豬豬,我會上樹,我正在爬樹,噓。。。" << std::endl;
}
//Turtle子類有參構造函數定義 
Turtle::Turtle(std::string theName) : Animal(theName) //重點!!! 
{
}void Turtle::swim()
{std::cout << "我是一只小甲魚,當母豬想抓我的時候,我就游到海里。。哈哈。。" << std::endl;
}int main()
{Pig pig("小豬豬");Turtle turtle("小甲魚");std::cout << "這只豬的名字是: " << pig.name << std::endl;std::cout << "每只烏龜都有個偉大的名字: " << turtle.name << std::endl;pig.eat();turtle.eat();pig.climb();turtle.swim();return 0;
}

?注意在子類的構造器定義里的” :Animal(theName)” 語法含義是:

  • – 當調用 Pig () 構造器時(以 theName 作為輸入參數), Animal ()構造器也將被調用( theName 輸入參數將傳遞給它)。
  • – 于是,當我們調用 Pig pig(“ 小豬豬” ); 將把字符串 “小豬豬” 傳遞給 Pig () 和 Animal (),賦值動作將實際發生在 Animal () 方法里。?

(6)C++ 支持多重繼承,即一個子類可以繼承多個父類。



未完待續。。。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/77224.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/77224.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/77224.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用PyTorch訓練VGG11模型:Fashion-MNIST圖像分類實戰

本文將通過代碼實戰&#xff0c;詳細講解如何使用 PyTorch 和 VGG11 模型在 Fashion-MNIST 數據集上進行圖像分類任務。代碼包含數據預處理、模型定義、訓練與評估全流程&#xff0c;并附上訓練結果的可視化圖表。所有代碼可直接復現&#xff0c;適合深度學習初學者和進階開發者…

汽車BMS技術分享及其HIL測試方案

一、BMS技術簡介 在全球碳中和目標的戰略驅動下&#xff0c;新能源汽車產業正以指數級速度重塑交通出行格局。動力電池作為電動汽車的"心臟"&#xff0c;其性能與安全性不僅直接決定了車輛的續航里程、使用壽命等關鍵指標&#xff0c;更深刻影響著消費者對電動汽車的…

打造船岸“5G+AI”智能慧眼 智驅力賦能客船數智管理

項目介紹 船舶在航行、作業過程中有著嚴格的規范要求&#xff0c;但在實際航行與作業中往往會因為人為的疏忽&#xff0c;發生事故&#xff0c;導致人員重大傷亡和財產損失&#xff1b; 為推動安全治理模式向事前預防轉型&#xff0c;實現不安全狀態和行為智能預警&#xff0c…

C#二叉樹

C#二叉樹 二叉樹是一種常見的數據結構&#xff0c;它是由節點組成的一種樹形結構&#xff0c;其中每個節點最多有兩個子節點。二叉樹的一個節點通常包含三部分&#xff1a;存儲數據的變量、指向左子節點的指針和指向右子節點的指針。二叉樹可以用于多種算法和操作&#xff0c;…

WinForm真入門(11)——ComboBox控件詳解

WinForm中 ComboBox 控件詳解? ComboBox 是 WinForms 中一個集文本框與下拉列表于一體的控件&#xff0c;支持用戶從預定義選項中選擇或直接輸入內容。以下從核心屬性、事件、使用場景到高級技巧的全面解析&#xff1a; 一、ComboBox 核心屬性? 屬性說明示例?Items?下拉…

超詳細解讀:數據庫MVCC機制

之前文章&#xff1a;Mysql鎖_exclusivelock for update寫鎖-CSDN博客 中有提到通過MVCC來實現快照讀&#xff0c;從而解決幻讀問題&#xff0c;這里詳細介紹下MVCC。 一、前言 表1&#xff1a;實例表t idk1122 表2&#xff1a;事務A、B、C的執行流程 事務A事務B事務Cstart …

【SpringCloud】從入門到精通【上】

今天主播我把黑馬新版微服務課程MQ高級之前的內容都看完了&#xff0c;雖然在看視頻的時候也記了筆記&#xff0c;但是看完之后還是忘得差不多了&#xff0c;所以打算寫一篇博客再溫習一下內容。 課程坐標:黑馬程序員SpringCloud微服務開發與實戰 微服務 認識單體架構 單體架…

力扣hot100_回溯(2)_python版本

一、39. 組合總和&#xff08;中等&#xff09; 代碼&#xff1a; class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:ans []path []def dfs(i: int, left: int) -> None:if left 0:# 找到一個合法組合ans.append(pa…

AI平臺如何實現推理?數算島是一個開源的AI平臺(主要用于管理和調度分布式AI訓練和推理任務。)

數算島是一個開源的AI平臺&#xff0c;主要用于管理和調度分布式AI訓練和推理任務。它基于Kubernetes構建&#xff0c;支持多種深度學習框架&#xff08;如TensorFlow、PyTorch等&#xff09;。以下是數算島實現模型推理的核心原理、架構及具體實現步驟&#xff1a; 一、數算島…

cesium項目之cesiumlab地形數據加載

之前的文章我們有提到&#xff0c;使用cesiumlab加載地形出現了一些錯誤&#xff0c;沒有解決&#xff0c;今天作者終于找到了解決方法&#xff0c;下面描述一下具體步驟&#xff0c;首先在地理數據云下載dem數據&#xff0c;在cesiumlab中使用地形切片&#xff0c;得到terrain…

[Vue]App.vue講解

頁面中可以看見的內容不再在index.html中進行編輯&#xff0c;而是在App.vue中進行編輯。 組件化開發 在傳統的html開發中&#xff0c;一個頁面的資源往往都寫在同一個html文件中。這種模式在開發小規模、樣式簡單的項目時會相當便捷&#xff0c;但當項目規模越來越大&#xf…

sql-labs靶場 less-1

文章目錄 sqli-labs靶場less 1 聯合注入 sqli-labs靶場 每道題都從以下模板講解&#xff0c;并且每個步驟都有圖片&#xff0c;清晰明了&#xff0c;便于復盤。 sql注入的基本步驟 注入點注入類型 字符型&#xff1a;判斷閉合方式 &#xff08;‘、"、’、“”&#xf…

藍橋杯-小明的彩燈(差分)

問題描述&#xff1a; 差分數組 1. 什么是差分數組&#xff1f; 差分數組 c 是原數組 a 的“差值表示”&#xff0c;其定義如下&#xff1a; c[0] a[0]c[i] a[i] - a[i-1] &#xff08;i ≥ 1&#xff09; 差分數組記錄了相鄰元素的差值。例如&#xff0c;原數組 a [1, …

精品可編輯PPT | 基于湖倉一體構建數據中臺架構大數據湖數據倉庫一體化中臺解決方案

本文介紹了基于湖倉一體構建數據中臺架構的技術創新與實踐。它詳細闡述了數據湖、數據倉庫和數據中臺的概念&#xff0c;分析了三者的區別與協作關系&#xff0c;指出數據湖可存儲大規模結構化和非結構化數據&#xff0c;數據倉庫用于高效存儲和快速查詢以支持決策&#xff0c;…

最近api.themoviedb.org無法連接的問題解決

修改NAS的host需要用到SSH終端連接工具&#xff0c;比如常見的Putty&#xff0c;XShell&#xff0c;或者FinalShell等都可以&#xff0c;我個人還是習慣Putty。 1.輸入命令“ sudo -i ”回車&#xff0c;提示輸入密碼&#xff0c;密碼就是我們NAS的登錄密碼&#xff0c;輸入的…

0.機器學習基礎

0.人工智能概述&#xff1a; &#xff08;1&#xff09;必備三要素&#xff1a; 數據算法計算力 CPU、GPU、TPUGPU和CPU對比&#xff1a; GPU主要適合計算密集型任務&#xff1b;CPU主要適合I/O密集型任務&#xff1b; 【筆試問題】什么類型程序適合在GPU上運行&#xff1…

多類型醫療自助終端智能化升級路徑(代碼版.下)

醫療人機交互層技術實施方案 一、多模態交互體系 1. 醫療語音識別引擎 # 基于Wav2Vec2的醫療ASR系統 from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC import torchaudioclass MedicalASR:def __init__(self):self.processor = Wav2Vec2Processor.from_pretrai…

前端基礎:React項目打包部署服務器教程

問題背景 我做了一個React框架的前端的Node項目&#xff0c;是一個單頁面應用。 頁面路由用的是&#xff0c;然后使用了React.lazy在路由層級對每一個不同頁面進行了懶加載&#xff0c;只有打開那個頁面才會加載對應資源。 然后現在我用了Webpack5對項目進行了打包&#xff…

【深度學習:理論篇】--Pytorch基礎入門

目錄 1.Pytorch--安裝 2.Pytorch--張量 3.Pytorch--定義 4.Pytorch--運算 4.1.Tensor數據類型 4.2.Tensor創建 4.3.Tensor運算 4.4.Tensor--Numpy轉換 4.5.Tensor--CUDA&#xff08;GPU&#xff09; 5.Pytorch--自動微分 &#xff08;autograd&#xff09; 5.1.back…

使用 Spring Boot 快速構建企業微信 JS-SDK 權限簽名后端服務

使用 Spring Boot 快速構建企業微信 JS-SDK 權限簽名后端服務 本篇文章將介紹如何使用 Spring Boot 快速構建一個用于支持企業微信 JS-SDK 權限校驗的后端接口&#xff0c;并提供一個簡單的 HTML 頁面進行功能測試。適用于需要在企業微信網頁端使用掃一掃、定位、錄音等接口的…