C++基礎-類與對象(2)

来源:https://www.cnblogs.com/wht-de-bk/archive/2022/04/23/16183233.html
-Advertisement-
Play Games

C++-類與對象(2)-繼承 繼承 一個小引子 有些類之間存在特殊的關係,像下麵的圖一樣: 定義這些類時,下級的成員除了有向上一級類的共性,還有自己的特性,這時,就可以用繼承的技術,減少代碼的重覆 繼承的基本語法 class 子類 : 繼承方式 父類 子類:也叫派生類 父類:也叫基類 #includ ...


C++-類與對象(2)-繼承

繼承

一個小引子

有些類之間存在特殊的關係,像下麵的圖一樣:

定義這些類時,下級的成員除了有向上一級類的共性,還有自己的特性,這時,就可以用繼承的技術,減少代碼的重覆

繼承的基本語法

class 子類 : 繼承方式 父類
  • 子類:也叫派生類
  • 父類:也叫基類
#include<iostream>          
using namespace std;
//普通頁面實現

//java頁面
//class Java{
//public:
//	void header(){
//		cout << "首頁,登錄,註冊(公共頭部)" << endl;
//	}
//	
//	void footer(){
//		cout << "幫助中心,站內地圖(公共底部)" << endl;	
//	}
//	
//	void lefter(){
//		cout << "C++,Java,Phthon(公共分類列表)" << endl;
//	}
//	
//	void conter(){
//		cout << "Java學科的視頻" << endl;
//	}
//};

//class Python{
//public:
//  ...和前面一樣
//	void conter(){
//		cout << "Python學科的視頻" << endl;
//	}
//};

//class Cpp{
//public:
//  ...和前面一樣
//	void conter(){
//		cout << "C++學科的視頻" << endl;
//	}
//};

//繼承實現頁面
//公共頁面類
class BagePage{
public:
	void header(){
		cout << "首頁,登錄,註冊(公共頭部)" << endl;
	}
	
	void footer(){
		cout << "幫助中心,站內地圖(公共底部)" << endl;
	}
	
	void lefter(){
		cout << "C++,Java,Phthon(公共分類列表)" << endl;
	}
};

//Java頁面
class Java:public BagePage{
public:
	void conter(){
		cout << "Java學科的視頻" << endl;
	}		
};

//Python頁面
class Python:public BagePage{
public:
	void conter(){
		cout << "Python學科的視頻" << endl;
	}		
};

//Cpp頁面
class Cpp:public BagePage{
public:
	void conter(){
		cout << "C++學科的視頻" << endl;
	}	
};

void test01(){
	cout << "Java界面下載" << endl;
	Java ja;
	ja.header();
	ja.lefter();
	ja.footer();
	ja.conter();
	cout << "=========================" << endl;
	cout << "Python界面下載" << endl;
	Python py;
	py.header();
	py.lefter();
	py.footer();
	py.conter();
	cout << "=========================" << endl;
	cout << "C++界面下載" << endl;
	Cpp cpp;
	cpp.header();
	cpp.lefter();
	cpp.footer();
	cpp.conter();
}

int main(){
	test01();
	return 0;
}

兩次結果均是

子類中包含兩大成員:1是自己增加的成員(共性) 2.是從父類中繼承的過來的(共性)

繼承方式

繼承一共3種方式

  • 公共繼承
  • 保護繼承
  • 私有繼承

繼承中的對象模型

從父類繼承到子類的成員,那些屬於子類的對象中

父類中非靜態的成員屬性都會被子類繼承下去(私有屬性只是被編譯器隱藏了)

#include<iostream>          
using namespace std;

class Base{
public:
	int m_a;
protected:
	int m_b;
private:
	int m_c;	
};

class Son:public Base{
public:
	int m_d;
};

void test01(){
	cout << "size of Son is " << sizeof(Son) << endl;
}

int main(){
	test01();
	return 0;
}

查看對象模型

利用開發人員命令提示工具

  1. 跳轉盤符
  2. 跳轉文件路徑 cd 具體路徑
  3. 查看:cl /dl reportSlingleClassLayout類名 文件名(回車)

繼承中構造和析構順序

構造:先父類後子類

析構:先子類後父類

繼承中同名成員處理 方式

當我們的子類和父類出現同名的成員,如何通過子類對象來訪問到子類或父類中同名的數據呢

  • 訪問子類同名成員:直接訪問即可
  • 訪問父類同名成員:需要加作用域

同名的成員屬性

#include<iostream>          
using namespace std;
//父類:m_a = 100
//子類:m_a = 200
class Base{//父類
public:
	int m_a;
	
	Base(){
		m_a = 100;
	}
};

class Son:public Base{//子類
public:
	int m_a;
	Son(){
		m_a = 200;
	}
};

void test01(){
	Son s;
    /*=====================================================*/
	cout << "子類的m_a:"<< s.m_a << endl;//直接訪問
    cout << "父類的m_a:" << s.Base::m_a << endl;//添加父類的作用域
    /*=====================================================*/
}

int main(){
	test01();	
	return 0;
}

同名的成員函數

如果出現同名的情況,子類中的同名函數會隱藏掉父類中所有的同名函數(包括重載函數)

#include<iostream>          
using namespace std;
class Base{
public:
	int m_a;
	Base(){
		m_a = 100;
	}
	
	void func(){
		cout << "父類的m_a:" << m_a << endl;
	}
};

class Son:public Base{
public:
	int m_a;
	Son(){
		m_a = 200;
	}
    
	void func(){
		cout << "子類的m_a:" << m_a << endl;
	}	
};

void test02(){
	Son s;
     /*=====================================================*/
	s.func();
	s.Base::func();	
     /*=====================================================*/
}

int main(){
	test02();
	return 0;
}

小總結

  • 子類對象可以直接訪問子類中同名的成員
  • 子類加作用域可以訪問父類中的成員
  • 如果出現同名的情況,子類中的同名函數會隱藏掉父類中所有的同名函數

繼承中同名靜態處理方法

和上面是一樣的哦...

  • 訪問子類同名成員:直接訪問即可
  • 訪問父類同名成員:需要加作用域

我就不寫嘍(嘿嘿)

emmm,複習一下訪問方法

//成員
Son s;
	//通過對象訪問
	cout << "子類的m_a:"<< s.m_a << endl;//直接訪問
	cout << "父類的m_a:" << s.Base::m_a << endl;//添加父類的作用域
	//通過類名來訪問
	cout << Son::m_a << endl;
	cout << Son::Base::m_a << endl;
//函數
Son s;
	s.func();
	s.Base::func();
	
	Son::func();
	Son::Base::func();

多繼承語法

C++可以一個類繼承多個類(一個兒子認多個父親...)

多繼承更會觸發同名的問題,要註意加作用域區分

實際開發不建議使用(經典白學)

語法

class 類名:繼承方式1 父類1,繼承方式2 父類2...

例子

#include<iostream>          
using namespace std;
//父類1是100
//父類2是200
//子類是300
class Base1{//父類1
public:
    int m_a;
    Base1(){
	  m_a = 100;
    }	
};

class Base2{//父類2
public:
	int m_a;
	Base2(){
		m_a = 200;		
	}
};

class Son:public Base1,public Base2{//子類
public:
    int m_a;	
	Son(){
		m_a = 300;
	}	
};

void test01(){
	Son s;
	cout << "子類的m_a:" << s.m_a << endl;
	cout << "父類1的m_a:" << s.Base1::m_a << endl;
	cout << "父類2的m_a:" << s.Base2::m_a << endl;
}

int main(){
	test01();
	return 0;
}

菱形繼承

概念

  • 兩個派生類繼承同一基類

  • 又有某個類同時繼承兩個派生類

這樣就叫做菱形繼承啦,或是叫做鑽石繼承

但是會出現一些問題:

  • 若有同名數據,要加作用域區分
  • 子類相同數據可能會有多份,既浪費,又沒用(用虛繼承來解決,關鍵字:virtual)

例子

沒有虛繼承:

#include<iostream>          
using namespace std;
class Base{//虛基類
public:
    int m_age;	
};

class Son1: public Base{};

class Son2: public Base{};

class GrandSon:public Son1,public Son2{};

void test01(){
	GrandSon gs;
	gs.Son1::m_age = 18;
	gs.Son2::m_age = 28;
	cout << "Son1的年齡" <<gs.Son1::m_age << endl;
	cout << "Son2的年齡" <<gs.Son2::m_age << endl;
	//但是GrandSon的年齡只要一個就好了,但現在有兩份
	//利用虛繼承解決:
	//繼承前加關鍵字
	cout << gs.m_age;
}

int main(){
	test01();
	return 0;
}

加上虛繼承

class Son1:virtual public Base{};

class Son2:virtual public Base{};

void test01(){
    ...
    cout << gs.m_age;
}


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

-Advertisement-
Play Games
更多相關文章
  • Q641H/Y氣動高溫球閥是採用金屬硬密封球閥及活塞式氣動執行器組成。密封面採用金屬硬密封閥座,可適用於≤500°以內的介質。氣動高溫球閥可配以閥門定位器輸入控制信號(4-20mADC或1-5VDC)氣源即可控制運轉。亦可配行程限位開關、電磁閥、減壓閥及0.4~0.7MPa氣源可實現開關操作,並送出... ...
  • BQ41F/BQ41H保溫球閥具有良好的保溫保冷特性,且閥門的通徑與管徑一致,同時又能有效降低管路中介質熱量損失。主要用於石油、化工、冶金、製藥、食品等各類系統中,以輸送常溫下會凝固的高粘度介質。 ...
  • Q41F三片式法蘭球閥適用於PN1.0~6.4MPa,工作溫度-29~180℃(密封圈為增強聚四氟乙烯)或-29~300℃(密封圈為對位聚苯)的各種管路上,用於截斷或接通管路中的介質。選用不同的材質可分別適用於水、蒸汽、油品、硝酸、醋酸等多種介質。 ...
  • Q41F天然氣球閥該閥門採用成形聚四氟乙烯填料,適用於大多數高中壓燃氣輸送場合,手柄操作力矩平穩,O形密封圈用來防止外部雜質進入閥門內部。並保持閥門長期密封性能,大於DN150的球閥採用蝸輪驅動。 ...
  • Q971F電動對夾球閥通過電動執行器及超薄球閥組成,通常電動對夾球閥適用於安裝位置比較短的場合。電動對夾球閥配用的CHR系列執行機構可直接接收電腦或工業儀錶等輸出的4~20mADC或1~5VDC控制信號 ...
  • Q641TC氣動陶瓷球閥具有超強的耐腐蝕、耐高溫、耐磨損及耐沖蝕等顯著特點。廣泛應用於石化、冶金、造紙、電站、煉油等行業的各類酸鹼鹽氣體、液體、高溫蒸汽和泥漿輸送系統中。 ...
  • 最近幾天我一直常用的Kubuntu(KDE yes!)更新至22.04後居然出現無法更改軟體源的bug,去Kubuntu論壇一看有同樣問題的人還不在少數,但卻沒有好的解決辦法,故而只有備份數據裝回Ubuntu。 由於學習需要,我需要再裝一遍Pytorch。Pytorch在linux上安裝推薦使用co ...
  • 最近沉寂的太久了,只為了給大家準備這一套試題,這大概是全網最全面的了,各位學這麼久Python,檢驗學習成果的時間到了!! 話不多說我們直接開始把! 一、填空題 001、Python安裝擴展庫常用的工具是lxx__lxx__和conda,其中後者需要安裝Python集成開發環境Anaconda3之後 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...