C/C++ | 每日一練 (2)

💢歡迎來到張胤塵的技術站
💥技術如江河,匯聚眾志成。代碼似星辰,照亮行征程。開源精神長,傳承永不忘。攜手共前行,未來更輝煌💥

文章目錄

  • C/C++ | 每日一練 (2)
    • 題目
    • 參考答案
      • 封裝
      • 繼承
      • 多態
        • 虛函數
        • 底層實現
          • 單繼承
          • 多繼承
        • 注意事項

C/C++ | 每日一練 (2)

題目

簡述 c++ 面向對象的三大特性。

參考答案

面向對象三大特性:封裝、繼承、多態。

封裝

封裝指的是將對象的行為和屬性結合成為一個類,并隱藏對象的內部實現細節,僅通過對象的接口(即公開的方法)與外界交互。

  • 隱藏內部實現細節:保護對象的內部狀態,防止外部直接訪問或修改對象的私有成員。
  • 提供統一的接口:通過公開的方法(如構造函數、成員函數等)對外提供服務,使對象的使用更加安全和方便。

例如:

#include <iostream>class Person
{
private:// 私有成員,外部無法直接訪問std::string name;int age;public:// 提供接口訪問私有成員void setName(const std::string &newName){name = newName;}void setAge(int newAge){age = newAge;}void display() const{std::cout << name << " is " << age << " years old." << std::endl;}
};

繼承

繼承是指一個類(派生類或子類)可以繼承另一個類(基類或父類)的屬性和方法。子類可以擴展或修改父類的功能,而無需重新編寫相同的代碼,支持代碼重用和擴展。繼承可以是單繼承或多繼承(在 c++ 中支持)

繼承的主要作用是:

  • 代碼復用:減少重復代碼,提高開發效率。
  • 拓展功能:派生類可以在繼承基類的基礎上,添加新的功能或修改現有功能。
#include <iostream>class Animal
{
public:void eat(){std::cout << "animal eat" << std::endl;}
};class Dog : public Animal
{
public:void bark(){std::cout << "dog eat" << std::endl;}
};

多態

多態是指相同的接口在不同的類實例上具有不同的表現形式。多態分為:

  • 編譯時多態(函數重載和運算符重載)

  • 運行時多態(通過虛函數實現)。

運行時多態是面向對象編程中最重要的多態形式,它通過虛函數和繼承實現。

例如:

#include <iostream>class Shape
{
public:// 定義為虛函數virtual void draw() const{std::cout << "drawing a shape" << std::endl;}
};class Circle : public Shape
{
public:// 重寫基類的虛函數void draw() const override{std::cout << "drawing a circle" << std::endl;}
};class Square : public Shape
{
public:// 重寫基類的虛函數void draw() const override{std::cout << "drawing a square" << std::endl;}
};int main()
{Shape *s1 = new Circle();Shape *s2 = new Square();s1->draw(); // drawing a circles2->draw(); // drawing a squaredelete s1;delete s2;
}
虛函數

c++ 中,虛函數是實現運行時多態的關鍵機制。它允許派生類重寫繼承自基類的成員函數,從而在運行時根據對象的實際類型調用相應的函數實現。

虛函數是在基類中通過關鍵字 virtual 聲明的成員函數。它的作用是讓派生類可以覆蓋該函數,從而實現多態行為。

#include <iostream>class Base {
public:virtual void display() { std::cout << "Base::display()" << std::endl;}
}

虛函數的主要作用是實現 動態綁定或運行時多態。具體來說:

  • 當通過基類指針或引用調用虛函數時,程序會根據對象的實際類型(派生類類型)來調用對應的函數實現。
  • 如果沒有虛函數,調用的將是基類的成員函數,而不是派生類的實現,這種行為稱為靜態綁定
#include <iostream>class Base {
public:virtual void display() {std::cout << "Base::display()" << std::endl;}
};class Derived : public Base {
public:// 重寫基類的虛函數void display() override {std::cout << "Derived::display()" << std::endl;}
};int main() {Base* ptr = new Derived();delete ptr;return 0;
}

在上述代碼中,ptr 是基類指針指向子類對象,由于 display() 是虛函數,程序會調用派生類的 display() 的實現。

底層實現

虛函數的實現依賴于虛表(簡稱 vtable)和虛表指針vptr):

  • 每個包含虛函數的類都有一個虛表(vtable),虛表中存儲了該類中所有虛函數的地址。
  • 每個對象在對象頭中會隱式地包含一個虛表指針(vptr),指向其所屬類的虛表。
  • 當通過基類指針或引用調用虛函數時,程序會通過 vptr 查找虛表,然后在虛表中根據函數索引找到正確的函數地址。
  • 執行函數調用。
單繼承

單繼承的動態多態結構圖如下所示:

在這里插入圖片描述

多繼承

多繼承是 c++ 中的一種繼承方式,它允許一個子類從多個基類繼承屬性和行為。這種繼承方式可以提供更大的靈活性,使得派生類能夠組合多個基類的特性。但是,多繼承也引入了復雜性,尤其是在內存布局、虛函數表、構造和析構順序等方面。多繼承的動態多態結構圖如下所示:

#include <iostream>class Base1
{
public:virtual void display(){std::cout << "Base1::display()" << std::endl;}virtual void show(){std::cout << "Base1::show()" << std::endl;}virtual ~Base1(){std::cout << "Base1::~Base1()" << std::endl;}private:int a;int b;
};class Base2
{
public:virtual void cat(){std::cout << "Base2::cat()" << std::endl;}virtual ~Base2(){std::cout << "Base2::~Base2()" << std::endl;}private:int c;
};class Derived : public Base1, public Base2
{
public:// 重寫基類的虛函數void display() override{std::cout << "Derived::display()" << std::endl;}void cat() override{std::cout << "Derived::cat()" << std::endl;}~Derived() override {std::cout << "Derived::~Derived" << std::endl;}
private:int d;
};int main() {Base1* ptr1 = new Derived();Base2* ptr2 = new Derived();delete ptr1;delete ptr2;return 0;
}

在這里插入圖片描述

注意事項
  • 虛函數必須是成員函數:全局函數或靜態成員函數不能聲明為虛函數。
  • 派生類的覆蓋函數必須與基類的虛函數具有相同的簽名(函數名、參數類型和數量)。如果派生類的函數與基類虛函數簽名不一致(函數名相同,參數類型和數量不相同),則不會覆蓋而是隱藏。
  • 純虛函數:在基類中,可以將虛函數聲明為純虛函數,即在聲明時賦值為 = 0。包含純虛函數的類稱為抽象類,不能實例化對象。
class AbstractClass {
public:virtual void func() = 0;  // 純虛函數
};
  • 析構函數的虛化:如果基類有虛函數,通常需要將析構函數聲明為虛函數,以確保通過基類指針刪除派生類對象時,能夠正確調用派生類的析構函數。
class Base {
public:virtual ~Base() { cout << "Base destructor" << endl; }
};class Derived : public Base {
public:~Derived() { cout << "Derived destructor" << endl; }
};
  • 虛函數的實現依賴于虛表和虛表指針,因此會帶來一定的性能開銷;每個對象需要存儲一個虛表指針(通常為 4 字節或 8 字節)。
  • 動態多態在調用虛函數時需要通過虛表查找函數地址,這比直接調用非虛函數稍慢。但是這種開銷通常是可以接受的,特別是在需要多態的場景中。

🌺🌺🌺撒花!

如果本文對你有幫助,就點關注或者留個👍
如果您有任何技術問題或者需要更多其他的內容,請隨時向我提問。

在這里插入圖片描述

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

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

相關文章

【前端框架】vue2和vue3的區別詳細介紹

Vue 3 作為 Vue 2 的迭代版本&#xff0c;在性能、語法、架構設計等多個維度均有顯著的變革與優化。以下詳細剖析二者的區別&#xff1a; 響應式系統 Vue 2 實現原理&#xff1a;基于 Object.defineProperty() 方法實現響應式。當一個 Vue 實例創建時&#xff0c;Vue 會遍歷…

基于Spring Boot的農事管理系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

【RISCV 常見匯編指令學習 1.2 -- CSRW | CSRR | XORI | ANDI | DRET | J | JR】

文章目錄 Overview1. CSRW 與 CSRR2. SW 與 lw3. XORI 與 ANDI4. J 與 JR5. ret 與 dret6. 總結&#x1f310; Sources Overview 在 RISCV 匯編中&#xff0c;不同類型的指令用于完成控制寄存器操作、內存存取、位操作、跳轉以及返回等功能。下面將逐對詳細介紹這些指令&#…

MySQL六大日志的功能介紹。

前言 首先&#xff0c;MySQL的日志應該包括二進制日志&#xff08;Binary Log&#xff09;、錯誤日志&#xff08;Error Log&#xff09;、查詢日志&#xff08;General Query Log&#xff09;、慢查詢日志&#xff08;Slow Query Log&#xff09;、重做日志&#xff08;Redo …

【AI】GitHub Copilot

GitHub Copilot 是一款由 GitHub 和 OpenAI 合作開發的 AI 編程助手&#xff0c;它可以在多種開發工具中使用。以下是 GitHub Copilot 支持的主要開發工具和平臺&#xff1a; 1. Visual Studio Code (VS Code) 官方支持&#xff1a;GitHub Copilot 在 VS Code 中擁有最完整的集…

拆解微軟CEO納德拉戰略藍圖:AI、量子計算、游戲革命如何改寫未來規則!

2025年2月19日 知名博主Dwarkesh Patel對話微軟CEO薩蒂亞納德拉 在最新訪談釋放重磅信號&#xff1a;AI將掀起工業革命級增長&#xff0c;量子計算突破引爆材料科學革命&#xff0c;游戲引擎進化為世界模擬器。 整個視頻梳理出幾大核心觀點&#xff0c;揭示科技巨頭的未來十年…

4.2 學習UVM中的“connect_phase“,將其應用到具體案例分為幾步?

文章目錄 前言1. connect_phase 的作用與執行順序2. TLM 連接的類型與示例2.1 生產者-消費者模型2.2 分析端口廣播模型 3. 層次化連接示例4. 動態連接與條件化配置5. 關鍵注意事項6. 完整示例&#xff1a;SoC 驗證環境連接6.1 Monitor 廣播數據6.2 Scoreboard 和 Coverage6.3 E…

HBase Shell

目錄 1. HBase常用命令1.1 create命令1.2 list命令1.3 describe命令1.4 put命令1.5 get命令1.6 scan命令1.7 count命令1.8 exists命令1.9 修改表結構1.10 delete命令1.11 deleteall命令1.12 truncate命令1.13 disable、drop命令1.14 status命令1.15 version命令 2. HBase Shell…

MATLAB基礎學習相關知識

MATLAB安裝參考&#xff1a;抖音-記錄美好生活 MATLAB基礎知識學習參考&#xff1a;【1小時Matlab速成教程-嗶哩嗶哩】 https://b23.tv/CnvHtO3 第1部分&#xff1a;變量定義和基本運算 生成矩陣&#xff1a; % 生成矩陣% 直接法% ,表示行 ;表示列 a [1,2,3;4,5,6;7,8,9];%…

用自定義注解實現Excel數據導入中的枚舉值校驗

使用自定義注解實現Excel數據導入中的枚舉值校驗 在實際開發中&#xff0c;我們經常需要從Excel文件中導入數據&#xff0c;并且這些數據需要符合一定的規則&#xff0c;比如某些字段的值必須是預定義的枚舉值。本文將介紹如何使用自定義注解來實現這一功能&#xff0c;以提高…

基于ffmpeg+openGL ES實現的視頻編輯工具-opengl相關邏輯(五)

在我們的項目中,OpenGL ES 扮演著至關重要的角色,其主要功能是獲取圖像數據,經過一系列修飾后將處理結果展示到屏幕上,以此實現各種豐富多樣的視覺效果。為了讓大家更好地理解后續知識,本文將詳細介紹 OpenGL 相關代碼。需要注意的是,當前方案將對 OpenGL 的所有操作都集…

dify安裝

官網教程 https://github.com/langgenius/dify/blob/main/README_CN.md 1、下載源碼 git clone https://github.com/langgenius/dify.git 2、進入docker目錄 cd dify cd docker cp .env.example .env修改nginx對外端口配置 修改為9000 最后執行&#xff1a;docker compo…

前端導出word文件,并包含導出Echarts圖表等

基礎導出模板 const html <html><head><style>body {font-family: Times New Roman;}h1 {text-align: center;}table {border-collapse: collapse;width: 100%;color: #1118FF;font-weight: 600;}th,td {border: 1px solid black;padding: 8px;text-align: …

【ETL】從理論到Python實踐的數據處理

引言 ETL&#xff08;Extract, Transform, Load&#xff09;是一種數據處理過程&#xff0c;用于將數據從一個或多個源提取出來&#xff0c;進行清洗、轉換和整合&#xff0c;然后加載到目標數據倉庫或數據庫中。ETL 是數據倉庫和數據分析領域中不可或缺的一部分&#xff0c;廣…

若依Flowable工作流版本監聽器使用方法

1.前言 本文詳細介紹如何在若依Flowable工作流版本&#xff08;RuoYi-Vue-Flowable&#xff09;中配置執行監聽器和任務監聽器。是以我二次開發的代碼為基礎&#xff0c;介紹如何配置監聽器&#xff0c;已解決源碼在新增或刪除監聽器出現的問題&#xff0c;如果需要二次開發的…

紛析云開源版- Vue2-增加字典存儲到localStorage

main.js //保存字典數據到LocalStorage Vue.prototype.$api.setting.SystemDictType.all().then(({data}) > {loadDictsToLocalStorage(data) })新增 dictionary.js 放在 Utils文件夾里面 // 獲取字典數據 export function getDictByType(dictType) {const dicts JSON.par…

jQuery UI CSS 框架 API

jQuery UI CSS 框架 API 概述 jQuery UI 是一個基于 jQuery 的用戶界面和交互庫,它提供了一套豐富的交互組件和視覺效果,旨在幫助開發者快速構建具有吸引力和互動性的網頁應用。jQuery UI CSS 框架 API 是 jQuery UI 的一部分,它允許開發者通過簡單的 CSS 類來控制 UI 組件…

VSCode自定義快捷鍵和添加自定義快捷鍵按鍵到狀態欄

VSCode自定義快捷鍵和添加自定義快捷鍵按鍵到狀態欄 &#x1f4c4;在VSCode中想實現快捷鍵方式執行某些指令操作&#xff0c;可以通過配置組合式的鍵盤按鍵映射來實現&#xff0c;另外一種方式就是將執行某些特定的指令嵌入在面板菜單上&#xff0c;在想要執行的時候&#xff0…

【C語言】指針(5)

前言&#xff1a;上篇文章的末尾我們使用了轉移表來解決代碼冗余的問題&#xff0c;那我們還有沒有什么辦法解決代碼冗余呢&#xff1f;有的這就是接下來要說的回調函數。 往期文章: 指針1 指針2 指針3 指針4 文章目錄 一&#xff0c;回調函數二&#xff0c;qsort實現快速排序1…