網站首頁 編程語言 正文
1.什么是虛函數?
用virtual
修飾的成員函數叫虛函數
小知識:?沒有虛構造函數??????? 不寫虛函數,沒有默認的虛函數
普通函數不影響類的內存:
class MM { public: void print() { cout << "普通函數"<< endl; //普通函數不影響類的內存<--->普通函數存在另一段內存中 } protected: }; void testVirtual() { //C語言不允許存在空的結構體 cout << sizeof(MM) << endl;/*(沒有數據成員的)空的類或者結構體 占用1字節 用1字節標識當 前內存為結構體內存*/ } int main() { testVirtual(); return 0; } /*輸出*/ /* 1 */
2.虛函數會影響類的內存
增加一個指針的內存,32位操作系統多4個字節 ,64位操作系統多8個字節
#include <iostream> using namespace std; class MM { public: virtual void print1() { cout << "虛函數1"<< endl; } /*virtual void print2() { cout << "虛函數2" << endl; } 無論多少個虛函數,增加的字節就是一個指針的字節--->多了一個虛函數,還是4個字節*/ protected: }; void testVirtual() { cout << sizeof(MM) << endl; } int main() { testVirtual(); return 0; } /*輸出*/ /* 4 */
小知識:一旦有了數據,標識位就不需要存在了
class A { int num; //輸出4而不是5 (4+1) }; class B { //用1字節標識當前內存為結構體內存 }; void testVirtual() { cout << sizeof(A) << endl; cout << sizeof(B) << endl; } int main() { testVirtual(); return 0; } /*輸出*/ /*4 1*/
3.了解虛函數表--->通過虛函數表的指針去訪問數據
就是一個指針存儲所有虛函數的首地址(虛函數函數名)<--->函數指針
只有指針可以操作一段內存(4字節)
/*無論多少個虛函數,增加的字節就是一個指針的字節*/
所有的虛函數其實是 用一個函數指針去存儲的 ,把 這個函數指針指向的這一段內存 稱為虛函數表
#include <iostream> using namespace std; class MM { public: virtual void print1() { cout << "虛函數1"<< endl; } virtual void print2() { cout << "虛函數2"<< endl; } protected: }; void testVirtual() { //虛函數表 MM mm; //構建一個對象 int** vptr = (int** )&mm; //定義一個二級指針&對象的地址 強轉類型 typedef void(*PF)(); //函數指針定義別名 PF func = (PF)vptr[0][0]; //把地址轉為函數指針,訪問第一個函數指針的地址 func(); //通過虛函數表的函數指針調用第一個虛函數 func = (PF)vptr[0][1]; func(); //調用第二個虛函數 } int main() { testVirtual(); return 0; } /*輸出*/ /*虛函數1 虛函數2*/
4.虛函數聲明
虛函數可以在類中聲明,在類外實現,不再需要virtual
修飾詞,只要類名限定就可以了
class MM { public: virtual void print3(); protected: }; void MM::print3() { cout << "虛函數3" << endl; } int main() { MM mm; mm.print3(); return 0; } /*輸出*/ /*虛函數3*/
原文鏈接:https://blog.csdn.net/weixin_60569662/article/details/121722479
相關推薦
- 2022-06-08 報錯:No fallback instance of type class**解決辦法
- 2022-12-29 C#使用Lambda表達式簡化代碼的示例詳解_C#教程
- 2023-12-11 Spring中的事務管理
- 2022-05-18 Python學習之自定義異常詳解_python
- 2022-08-22 Pycharm報錯Non-zero?exit?code?(2)的完美解決方案_python
- 2023-04-10 Android序列化接口Parcelable與Serializable接口對比_Android
- 2022-01-09 出現Got permission denied while trying to connect to
- 2022-05-13 類實例化 對象的內存模型 及 內存占用分析
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支