c++--面向對象特性

1.面向對象指的是繼承,封裝,多態。
繼承主要關注類的構造,賦值,析構。
以下對多態,封裝進行補充說明。

2、多態
2.1.定義
a.賦值
派生類的指針,可以賦值給基類的指針。
派送類的對象,可以賦值給基類的引用。
b.調用
通過基類指針調用基類虛函數時,若派生類提供了派生實現,則調用派生類版本。
通過基類引用調用基類虛函數時,若派送類提供了派送實現,則調用派生類版本。

2.2.最佳實踐
基類的析構函數應該定義成虛函數。

#include <iostream>class Base
{
public:Base() {}virtual void fun(){printf("B_fun()\n");}virtual ~Base(){printf("~Base()\n");}protected:int m_pro;private:int m_pri;
};class A : public Base
{
public:A() : Base() {}void fun(){printf("A_fun()\n");}~A(){printf("~A()\n");}
};int main()
{A *pA = new A();Base *pB = pA;pB->fun();delete pB;A a;Base &b = a;b.fun();return 0;
}

在這里插入圖片描述
2.3.注意點
多態針對類外部使用基類指針或基類引用調用基類虛函數時會發生。
多態針對基類內部調用虛函數,在隱式的this此時關聯到派生實例時也會發生。

#include <iostream>class Base
{
public:Base() {}virtual void fun(){printf("B_fun()\n");}void fun1(){printf("B_fun1()\n");fun();}virtual ~Base(){printf("~Base()\n");}protected:int m_pro;private:int m_pri;
};class A : public Base
{
public:A() : Base() {}void fun(){printf("A_fun()\n");}~A(){printf("~A()\n");}
};int main()
{A *pA = new A();Base *pB = pA;pB->fun1();delete pB;A a;Base &b = a;b.fun1();return 0;
}

在這里插入圖片描述
3.封裝
3.1.訪問權限修飾符
a.c++支持的訪問權限修飾符有public,protect,private
b.在類型內部,針對類型自身所有成員(不含基類)具有全量(public,protect,private)訪問權限。
c.在類型內部,針對類型基類,只能訪問基類的public,protect修飾的成員。
c.在類型友元內部,具有等價于類型內部的訪問權限。故對類型自身成員有全量訪問權限,只能訪問基類的public,protect修飾的成員。
d.在類型外部,針對類型自身成員,只對public成員具備訪問權限。針對基類成員,只對public繼承的基類的public成員具備訪問權限。

#include <iostream>class Base
{// 類的友元--全量訪問friend void friend_fun();
public:Base(int i, int j, int k) : m_pub(i), m_pro(j), m_pri(k) {}void fun(){// 類內部訪問--全量訪問printf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, m_pri);}public:int m_pub;
protected:int m_pro;
private:int m_pri;
};class A1 : public Base
{friend void friend_funA1();public:A1(int i, int j, int k) : Base(i, j, k) {}void fun1(){// 公共繼承者的內部--只能訪問公共基類的public&protectprintf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, 0);}
};// 保護繼承
class A2 : protected Base
{friend void friend_funA2();
public:A2(int i, int j, int k) : Base(i, j, k) {}void fun1(){// 保護繼承者的內部--只能訪問保護基類的public&protectprintf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, 0);}
};// 私有繼承
class A3 : private Base
{friend void friend_funA3();public:A3(int i, int j, int k) : Base(i, j, k) {}void fun1(){// 私有繼承者的內部--只能訪問私有基類的public&protectprintf("pub_%d,pro_%d,pri_%d\n", m_pub, m_pro, 0);}
};void friend_fun()
{// 友元的內部--對類型自身成員全量訪問Base b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro, b.m_pri);
}void friend_funA1()
{// 友元的內部--對基類,公共基類的public&protectA1 b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro);
}void friend_funA2()
{// 友元的內部--對基類,保護基類的public&protectA2 b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro);
}void friend_funA3()
{// 友元的內部----對基類,私有基類的public&protectA3 b(1, 2, 3);printf("pub_%d,pro_%d,pri_%d\n", b.m_pub, b.m_pro, 0);
}int main()
{Base b(11, 22, 33);// 類不相干的外部--針對類自身成員,只能訪問類自身的public成員。b.m_pub;A1 a1(2, 3, 4);// 類不相干的外部--針對類基類成員,只能訪問公共基類自身的public成員。printf("pub_%d,pro_%d,pri_%d\n", a1.m_pub, 0, 0);// 類不相干的外部--針對類基類成員,只能訪問公共基類自身的public成員。A2 a2(3, 4, 5);printf("pub_%d,pro_%d,pri_%d\n", 0, 0, 0);// 類不相干的外部--針對類基類成員,只能訪問公共基類自身的public成員。A3 a3(4, 5, 6);printf("pub_%d,pro_%d,pri_%d\n", 0, 0, 0);
}

理解繼承時,對基類的權限修飾。可以認為是指定基類成員被合并到派生類成員時,允許放入的權限區域。
對public繼承,允許被放入public,protect,private區域。所以,按基類成員一致權限放入。
對protect繼承,允許被放入protect,private區域。所以,基類public,protect成員放入protect區域;private成員放入private區域。
對private繼承,允許被放入private區域。所以,基類成員一致放入private區域。

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

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

相關文章

教師需要什么技能?

作為一名老師&#xff0c;需要掌握許多技能&#xff0c;以便能夠成功地教育和指導學生。以下是一些關鍵技能&#xff1a; 1.教學技能&#xff1a;老師需要有深入的學科知識和教學經驗&#xff0c;以便能夠有效地傳授知識。教師應該了解如何設計和執行教學計劃&#xff0c;制定課…

【Java基礎篇 | 面向對象】—— 聊聊什么是接口(下篇)

個人主頁&#xff1a;兜里有顆棉花糖 歡迎 點贊&#x1f44d; 收藏? 留言? 加關注&#x1f493;本文由 兜里有顆棉花糖 原創 收錄于專欄【JavaSE_primary】 本專欄旨在分享學習JavaSE的一點學習心得&#xff0c;歡迎大家在評論區交流討論&#x1f48c; 上篇&#xff08;【Ja…

SpringBoot 自動裝配原理詳解

什么是 SpringBoot 自動裝配&#xff1f; 我們現在提到自動裝配的時候&#xff0c;一般會和 Spring Boot 聯系在一起。但是&#xff0c;實際上 Spring Framework 早就實現了這個功能。Spring Boot 只是在其基礎上&#xff0c;通過 SPI 的方式&#xff0c;做了進一步優化。 Spr…

解決npm install時報:gyp ERR! configure error

報錯內容&#xff1a; npm ERR! gyp ERR! cwd C:\Users\zccbbg\code\my\examvue\node_modules\node-sass npm ERR! gyp ERR! node -v v16.13.1 npm ERR! gyp ERR! node-gyp -v v3.8.0 npm ERR! gyp ERR! not ok npm ERR! Build failed with error code: 1 解決辦法&#xff1a;…

自行編寫一個簡單的shell!

本文旨在編寫一個簡單的shell外殼程序&#xff01;功能類似于shell的一些基本操作&#xff01;雖然不能全部實現shell的一些功能&#xff01;但是通過此文章&#xff0c;自己寫一個簡單的shell程序也是不成問題&#xff01;并且通過此文章&#xff0c;可以讓讀者對linux中一些環…

C#基礎面試題集

C#基礎 1. 簡述值類型和引用類型有什么區別2. C# String類型比 stringBuilder 類型的優勢是什么?3.面向對象的三大特點4.請簡述private&#xff0c;public&#xff0c;protected&#xff0c;internal的區別5.結構體和類6.請描述Interface與抽象類之間的不同7.在類的構造函數前…

藍橋杯:貨物擺放--因數存到數組里的技巧--減少運算量的方法

小藍有一個超大的倉庫&#xff0c;可以擺放很多貨物。 現在&#xff0c;小藍有 n 箱貨物要擺放在倉庫&#xff0c;每箱貨物都是規則的正方體。小藍規定了長、寬、高三個互相垂直的方向&#xff0c;每箱貨物的邊都必須嚴格平行于長、寬、高。 小藍希望所有的貨物最終擺成一個大…

go自帶rpc框架生產環境使用demo

基礎使用 序列化使用自帶gob協議 server package mainimport ("net""net/rpc" )// 定義一個handler結構體 type HelloService struct { }// 定義handler方法,大小寫&#xff0c;參數&#xff0c;返回值都是固定的&#xff0c;否則無法注冊 func (receiv…

數據庫事務:保障數據一致性的基石

目錄 1. 什么是數據庫事務&#xff1f; 1.1 ACID特性解析 2. 事務的實現與控制 2.1 事務的開始和結束 2.2 事務的隔離級別 3. 并發控制與事務管理 3.1 并發控制的挑戰 3.2 鎖和并發控制算法 4. 最佳實踐與性能優化 4.1 事務的劃分 4.2 批處理操作 5. 事務的未來發展…

Qt OpenCV 學習(文章鏈接匯總)

Qt OpenCV 學習&#xff08;一&#xff09;&#xff1a;環境搭建 Qt OpenCV 學習&#xff08;二&#xff09;&#xff1a;兩個簡單圖片識別案例 Qt OpenCV 學習&#xff08;三&#xff09;&#xff1a;跟蹤視頻中的運動物體 Qt OpenCV 學習&#xff08;四&#xff09;&#xff…

SpringSecurity6 | 自定義登錄頁面

?作者簡介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;熱愛Java后端開發者&#xff0c;一個想要與大家共同進步的男人&#x1f609;&#x1f609; &#x1f34e;個人主頁&#xff1a;Leo的博客 &#x1f49e;當前專欄&#xff1a; Java從入門到精通 ?特色專欄&#xf…

高工氫電年會 | 未勢能源解超朋博士受邀出席并做主題演講

12月4日&#xff0c;以“戰略重構 商業覺醒”為主題的2023高工氫電年會在深圳舉辦&#xff0c;未勢能源副總裁解超朋博士受邀出席開幕式論壇&#xff0c;以《把握機遇、直面挑戰&#xff0c;迎接氫車規模化推廣時代》為主題發表演講&#xff0c;并參與圓桌論壇研討。 氫勢已來&…

【Linux】resolv.conf 文件

resolv.conf resolv.conf 文件 是 DNS 的 client 端使用的文件&#xff0c;用于設置 DNS 服務器的 ip 地址以及 DNS 域名&#xff0c;還可以配置域名搜索順序等等。主要包含如下關鍵字&#xff1a;nameserver、domain、search、sortlist、options。設置的格式都是 關鍵字空格 …

管理類聯考——數學——真題篇——按知識分類——數據

文章目錄 排列組合2023真題&#xff08;2023-05&#xff09;-數據分析-排列組合-組合-C運算-至少-需反面思考真題&#xff08;2023-08&#xff09;-數據分析-排列組合-相鄰不相鄰-捆綁法插空法-插空法注意空位比座位多1個&#xff0c;是用A&#xff1b;捆綁法內部排序用A&#…

Linux(centos, ubuntu) 快速安裝anaconda;5秒安裝anaconda

1.下載Anaconda安裝腳本: 首先&#xff0c;訪問Anaconda的官方下載頁面&#xff1a;https://www.anaconda.com/products/distribution 在頁面上&#xff0c;選擇適用于Linux的Python 3.x版本的Anaconda安裝腳本。也可以使用wget或curl命令從終端下載。示例&#xff1a; wget …

2023中國(海南)國際高爾夫旅游文化博覽會 暨國際商界峰層·全球華人高爾夫精英巡回賽 全國潁商自貿港行盛大啟幕

2023中國&#xff08;海南&#xff09;國際高爾夫旅游文化博覽會&#xff08;以下簡稱“海高博”&#xff09;暨全國潁商走進海南自貿港于12月7-9日在海口觀瀾湖盛大開幕。該活動由中國國際貿易促進委員會海南省委員會、海南省旅游和文化廣電體育廳主辦&#xff0c;中國國際商會…

C語言中getchar函數

在 C 語言中&#xff0c;getchar() 是一個標準庫函數&#xff0c;用于從標準輸入&#xff08;通常是鍵盤&#xff09;讀取單個字符。它的函數原型如下&#xff1a; int getchar(void);getchar() 函數的工作原理如下&#xff1a; 當調用 getchar() 函數時&#xff0c;它會等待…

最新版本11.17的YOLOv8加入注意力方法

本文基于11.17版本,以往版本略有不同,可查看改進YOLOv8,教你YOLOv8如何添加20多種注意力機制進行參考 放入注意力代碼,以biformer注意力為例 import torch import torch.nn as nn import torch.nn.functional as Fdef position(H, W, is_cuda=

探索 Python 中鏈表的實現:從基礎到高級

# 更多資料獲取 &#x1f4da; 個人網站&#xff1a;ipengtao.com 鏈表是一種基礎的數據結構&#xff0c;它由一系列節點組成&#xff0c;每個節點都包含數據和指向下一個節點的引用。在Python中&#xff0c;可以使用類來實現鏈表&#xff0c;本文將介紹如何實現鏈表&#xff…

c語言編程題經典100例——(90~95例)

1,寫一個函數&#xff0c;實現數字的加密和解密。 下面是一個簡單的C語言函數&#xff0c;可以實現數字的加密和解密。這個函數采用簡單的加密算法&#xff0c;將輸入的數字乘以一個固定的密鑰&#xff0c;然后加上一個固定的偏移量。解密過程就是將加密后的數字減去偏移量&am…