c++關于虛表的一些筆記

文章目錄

  • 1、虛函數表指針
  • 2、多態構成的條件
  • 3、重載、重寫、重定義 三者區別
  • 4、繼承與虛函數
  • 5、單繼承中的虛函數表
    • 無虛函數覆蓋
    • 有虛函數覆蓋
  • 6、單繼承中的虛函數表
    • 無虛函數覆蓋
    • 有虛函數覆蓋
  • 參考

看《深度探索c++對象模型》的時候對虛表有了點疑惑,正好網上有些文章解除了這個疑惑,記錄一下

1、虛函數表指針

在64位操作系統下當我們計算包含虛函數的類大小時,我們會發現不管類中有幾個虛函數,類的大小都會比沒有虛函數時類的大小大8,這是因為存了一個指向虛表的指針,大小為8字節。
對象中的這個指針我們叫做虛函數表指針,虛函數指針指向的這個表叫虛函數表簡稱虛表,虛表中存的是虛函數的地址

圖1 類代碼
圖2 對象模型

2、多態構成的條件

  • 必須通過父類的指針或者引用調用虛函數
  • 父類的函數必須是虛函數,且子類必須對父類的虛函數進行重寫

3、重載、重寫、重定義 三者區別

在這里插入圖片描述

4、繼承與虛函數

在構造子類前會先構造父類,而在構造父類的時候,通過this指針看到如下圖左所示,虛函數表中存的父類中的三個虛函數的地址,而在構造子類的時候,可以看到如下圖右所示,父類中的虛函數在子類中被重寫的兩個虛函數將父類的虛函數覆蓋了,這就是多態父類指針保存子類地址卻可以通過父類指針訪問子類成員的原因
在這里插入圖片描述
當我們在子類中對父類的虛函數重寫后,當父類去調用該虛函數的時候,就會訪問虛表,然而虛表中存放的是已經被子類覆蓋的子類的函數,所以就會轉去調用子類中的重寫的虛函數。
在這里插入圖片描述
其實子類的虛函數是在虛表中的,只不過從監視器的角度看不到,因為從監視器的角度__vfptr的成員始終屬于父類的成員。

5、單繼承中的虛函數表

無虛函數覆蓋

虛函數按照其聲明順序放于表中;
父類的虛函數在子類的虛函數前面;
在這里插入圖片描述

有虛函數覆蓋

覆蓋的fun1()函數被放到了虛函數表中原來父類虛函數的位置
沒被覆蓋的函數依舊
在這里插入圖片描述

6、單繼承中的虛函數表

無虛函數覆蓋

每個父類都有自己的虛表
子類的成員函數被放到第一個父類的表中(所謂第一個父類是按照聲明順序來判斷的)------>這樣做是為了解決不同的父類類型的指針指向同一個子類實例,而能夠調用到實際的函數
在這里插入圖片描述
子類實例中的虛函數表如下圖所示:
在這里插入圖片描述

有虛函數覆蓋

只要子類中重寫的父類的虛函數都會覆蓋
沒被覆蓋的函數依舊
在這里插入圖片描述
子類虛函數表如下:
在這里插入圖片描述

參考

https://blog.csdn.net/weixin_50886514/article/details/117536971
https://bbs.csdn.net/topics/370154900?page=3

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

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

相關文章

4、在Shell程序中的使用變量

學習目標變量的賦值變量的訪問變量的輸入 12-4-1 變量的賦值在Shell編程中,所有的變量名都由字符串組成,并且不需要對變量進行聲明。要賦值給一個變量,其格式如下:變量名值。注意:等號()前后沒有空格例如: …

C語言技巧:把單一元素的數組放在末尾,struct可以擁有可變大小的數組

《C 對象模型》第19頁有這樣一句話 C程序員的巧計有時候卻成為c程序員的陷阱。例如把單一元素的數組放在一個struct的末尾,于是每個struct objects可以擁有可變數組的數組: struct mumble {/* stuff */char pc[1]; };//從文件或標準輸入裝置中取得一個…

探討C++ 變量生命周期、棧分配方式、類內存布局、Debug和Release程序的區別(二)...

看此文,務必需要先了解本文討論的背景,不多說,給出鏈接: 探討C 變量生命周期、棧分配方式、類內存布局、Debug和Release程序的區別(一) 本文會以此問題作為討論的實例,來具體討論以下四個問題&a…

后臺系統可擴展性學習筆記(一)概要

文章目錄系統大致架構可擴展性負載均衡器與會話保持引入冗余增強系統可用性緩存減輕數據庫壓力異步處理參考系統大致架構 當一個用戶請求從客戶端出發,經過網絡傳輸,達到 Web 服務層,接著進入應用層,最后抵達數據層,它…

poj 3728(LCA + dp)

題目鏈接:http://poj.org/problem?id3728 思路:題目的意思是求樹上a -> b的路徑上的最大收益(在最小值買入,在最大值賣出)。 我們假設路徑a - > b 之間的LCA(a, b) f, 并且另up[a]表示a - > f之間的最大收益…

成功之路

1、每天都要有進步,都要有新知識的收獲。 2、工作認真負責,高效的完成,多總結。 3、自己多練習一些感興趣的東西,實踐!!! 4、寫博客。 5、百度、騰訊、阿里是目標,差距還很大&#x…

后臺系統可擴展性學習筆記(二)權衡取舍

文章目錄性能與可擴展性延遲與吞吐量可用性與一致性一致性模式可用性模式可用性衡量參考系統設計中也面臨許多權衡取舍:性能與可擴展性延遲與吞吐量可用性與一致性 性能與可擴展性 可擴展,意味著服務能以加資源的方式成比例地提升性能,性能…

iOS中使用子線程的完整方法

第一步:開啟子線程 //開啟子線程到網絡上獲取數據myFirstThread [[NSThread alloc]initWithTarget:self selector:selector(thread1GetData) object:nil];[myFirstThread setName:"第一個子線程,用于獲取網絡數據"];[myFirstThread start]; 第二步&…

DIV的表單布局

表單布局其實用表格最好了&#xff0c;可是表格的話&#xff0c;無法定位&#xff0c;這個是一個硬傷。 <!DOCTYPE html> <html> <head> <meta charset"utf-8" /> <title>表單布局</title> <link rel"stylesheet" …

后臺系統可擴展性學習筆記(三)DNS機制原理

文章目錄DNS概念梳理域名基本概念資源記錄基本概念路由策略DNS 域空間結構實現原理復制機制查詢機制緩存機制參考DNS概念梳理 DNS&#xff08;Domain Name System&#xff09;相當于互聯網的通訊錄&#xff0c;能夠把域名翻譯成 IP 地址。 從技術角度來講&#xff0c;DNS 是個…

后臺系統可擴展性學習筆記(四)CDN機制原理

文章目錄概念梳理CDN拓撲結構CDN內容分發方式架構原理工作原理實現原理概念梳理 CDN&#xff08;Content Delivery Network&#xff0c;內容分發網絡&#xff09;是由分布在不同地理位置的代理服務器及其數據中心組成的網絡&#xff0c;希望在空間距離上為用戶就近提供服務&am…

Javascript 基礎—變量 運算符

經過找工作筆試的洗禮&#xff0c;感覺自己js語法方面掌握的不是很系統&#xff0c;今天來梳理下——變量以及運算符。 基礎篇 和C語言的不同點&#xff1a;是一種弱類型語言&#xff0c;申明變量時不需要指定類型&#xff1b;變量名的命名方法也有不同&#xff1b;簡單類型種類…

后臺系統可擴展性學習筆記(五)負載均衡

文章目錄Load balancer(負載均衡器)請求傳輸拆解DNS 負載均衡客戶端負載均衡OSI 七層模型回顧2 層、3 層負載均衡3/4 層負載均衡7 層負載均衡在 第一節談到了系統的橫向擴展在于從單機擴展到多機&#xff0c;那么面臨的第一個問題就是這些機器如何協同工作&#xff0c;即如何調…

Struts2第一個工程helloStruts極其基本配置

前面已經準備好了Struts-2.3.15&#xff0c;現在就可以直接搭建Struts2的工程了。前面http://blog.csdn.net/huangchnegdada/article/details/9179041有對Struts-2.3.15的準備工作的詳述。 首先打開MyEclispe新建一個Web Project&#xff0c;名字就叫Struts2_0100_Introduction…

[LeetCode]Find Minimum in Rotated Sorted Array

題目描述&#xff1a; Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). Find the minimum element. You may assume no duplicate exists in the array. 解題方案&#xff1a; 直接貼代碼&…

后臺系統可擴展性學習筆記(六)反向代理

文章目錄Web代理服務反向代理反向代理作用Web代理服務 Web 代理服務指的是在客戶端資源請求和提供這些資源的 Web 服務之間充當中介的角色&#xff0c;代理服務可以實現在客戶端&#xff0c;或者從客戶端到目標服務器中間的任意環節。 例如&#xff0c;客戶端不直接向提供目標…

(C)單鏈表

老師版 1 #include <stdio.h>2 #include <stdlib.h>3 4 // 定于Node數據類型5 struct Node6 {7 int data; // 數據域8 struct Node *next; // 指針域9 };10 11 // 創建一個單鏈表&#xff0c;并把head節點返回&#xff1b;…

實驗:sigsuspend(),sigprocmask()

實驗&#xff1a;sigsuspend(),sigprocmask()源代碼&#xff1a;/* * Program: pause_suspend.c * To test the difference between sigsuspend() and paus(). * Author: zsl * Date: 2014-10-17 * First release. * 參見網頁&#xff1a;http://blog.csdn.net/liwentao1091/ar…

后臺系統可擴展性學習筆記(七)Service Discovery與微服務

文章目錄應用層微服務架構服務注冊查詢 Service Discovery客戶端 Service DiscoveryDNS-SD DNS-based Service Discovery服務端 Service Discovery服務注冊與注銷自注冊模式第三方注冊模式總結參考應用層 在簡單的 3 層結構中&#xff0c;Web 服務層既要處理請求&#xff0c;又…