虛函數應用和原理

虛函數的表現形式

用子類初始化父類指針, 調用虛函數時, 仍然調用的是子類的虛函數
測試代碼如下

#include <iostream>
#include <string.h>using namespace std;class A
{
public:void test() { cout << 'a' << endl; };virtual void test2 (){ cout << 'a' << endl; };
};class B : public A
{
public:void test() { cout << 'b' << endl; };virtual void test2(){ cout << 'b' << endl; };
};int main()
{A* a = new B();a->test();a->test2();a->A::test2();
}

輸出結果是

a
b
a

虛函數的實現方式

虛函數表

實現的核心是虛函數表, 每個包含虛函數的類都包含一個虛表, 并且如果該類被繼承, 子類也會生成一個自己的虛表.

虛函數表指針

虛函數表是類的, 不是某個具體對象的, 同一個類的所有對象, 都使用同一張虛表, 那么, 對象類的虛表是如何綁定在一起的呢?
內部包含一個虛表指針__vptr, 指向虛函數表, 在編譯階段就已經生成. 所以當對象創建時, 便擁有了這個指向類的虛表的指針

關鍵問題

那么問題又來了, 用子類去初始化父類指針, 父類指針是指向父類部分, 為什么會調用子類的虛函數表呢?
C++中虛函數的作用是什么?它應該怎么用呢?
這篇文章里寫的很好, 大概意思就是, 直接調用虛函數的時候, 其實調用的不是真正的虛函數, 而是一個叫CallVirtualFun的代碼. 這段代碼會用來獲取真正虛函數地址, 最后調用虛函數.
個人認為這些CallVirtualFun里面的內容都是同樣的邏輯, 找到實例真正的虛函數指針, 然后在表中找到和自己同名的函數指針, 并執行.

其他問題

我們把經過虛表調用虛函數的過程稱為動態綁定,其表現出來的現象稱為運行時多態。
動態綁定區別于傳統的函數調用,傳統的函數調用我們稱之為靜態綁定,即函數的調用在編譯階段就可以確定下來了。

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

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

相關文章

LeetCode-2589. 完成所有任務的最少時間【棧 貪心 數組 二分查找 排序】

LeetCode-2589. 完成所有任務的最少時間【棧 貪心 數組 二分查找 排序】 題目描述&#xff1a;解題思路一&#xff1a;貪心暴力解題思路二&#xff1a;棧二分查找解題思路三&#xff1a;簡化版 題目描述&#xff1a; 你有一臺電腦&#xff0c;它可以 同時 運行無數個任務。給你…

解鎖電商數據之門:京東商品詳情API接口的深度解析與應用指南

一、京東商品詳情API簡介 京東商品詳情API是京東開放平臺提供的一項服務&#xff0c;允許第三方應用通過調用接口獲取京東商城中商品的詳細信息。這些信息包括但不限于商品名稱、價格、庫存、詳情描述、用戶評價等。 二、功能特點 數據全面&#xff1a;提供商品的全方位數據…

mac安裝兩個版本谷歌瀏覽器;在mac運行不同版本的chrome瀏覽器

場景 正常情況下&#xff0c;mac上只能安裝一個版本的chrome瀏覽器&#xff0c;即使你安裝了兩個版本的&#xff0c;打開老舊版本時候也會自動切換成最新版的瀏覽器 故本文主要解決如何下載和在mac運行不同版本的chrome瀏覽器 文章目錄 場景一、下載1.mac本身就有一個最新版ch…

Java語言saas模式云HIS系統源碼 前端Angular+后臺SpringBoot云HIS系統源碼 HIS系統適合哪些類型的醫院?

Java語言saas模式云HIS系統源碼 前端Angular后臺SpringBoot云HIS系統源碼 HIS系統適合哪些類型的醫院&#xff1f; 云HIS系統&#xff08;醫院信息系統&#xff09;是對醫院及其所屬各部門的人、財、物進行綜合管理&#xff0c;對在醫療活動各階段產生的數據進行采集、儲存、處…

CCF20181201——小明上學

CCF20181201——小明上學 代碼如下&#xff1a; #include<bits/stdc.h> using namespace std; int main() {int r,y,g,n,k[101],t[101],sum0;cin>>r>>y>>g;cin>>n; for(int i0;i<n;i){cin>>k[i]>>t[i];if(k[i]0||k[i]1)sumt[i];…

ITSM的服務臺如何讓工作更流暢

在現代企業的信息技術管理框架內&#xff0c;IT服務管理&#xff08;IT Service Management, ITSM&#xff09;體系扮演著至關重要的角色&#xff0c;而其中的服務臺則是這一復雜體系的心臟地帶。服務臺不僅僅是解答技術疑問的一線窗口&#xff0c;更是企業IT運維效率與用戶滿意…

C++初探_關聯容器

關聯容器將鍵和值關聯在一起&#xff0c;并使用鍵來查找值。STL提供的四種關聯容器&#xff1a; &#xff08;1&#xff09;set 鍵類型與值類型相同&#xff0c;鍵值對一一對應&#xff1b; &#xff08;2&#xff09;multiset 鍵類型與值類型相同&#xff0c;一個鍵可能對…

FENDI CLUB啤酒,為何女生喜歡?

精釀啤酒已經成了女生喜歡的飲品&#xff0c;在日劇《無法成為野獸的我們》里&#xff0c;主人公小晶永遠保持標準笑容&#xff0c;完美完成所有的工作。只有一個人的時候&#xff0c;她才會放下習慣性的微笑&#xff0c;顯露自己的疲憊。小晶緩解疲憊&#xff0c;就是下班后去…

盡微好物:從0到10億+的抖音電商的TOP1“聯盟團長”,如何使用NineData實現上云下云

杭州盡微供應鏈是抖?平臺?均帶貨10E的TOP1“聯盟團?”&#xff0c;是字節跳動?級代理商&#xff0c;巨量千川指定服務商&#xff0c;擁有商品庫9萬&#xff0c;是?業領先的電商供應鏈平臺&#xff0c;達?陪跑機構。 杭州盡微供應鏈以天貓、京東抖音電商業務為依托&#x…

代碼隨想錄Day41(01背包問題):卡瑪網46、Leetcode416

卡瑪網46&#xff1a; 問題描述&#xff1a; 小明是一位科學家&#xff0c;他需要參加一場重要的國際科學大會&#xff0c;以展示自己的最新研究成果。他需要帶一些研究材料&#xff0c;但是他的行李箱空間有限。這些研究材料包括實驗設備、文獻資料和實驗樣本等等&#xff0…

HCIP-Datacom(H12-821)題庫補充(5月16日)

最新 HCIP-Datacom&#xff08;H12-821&#xff09;完整題庫請掃描上方二維碼訪問&#xff0c;持續更新中。 以下關于配置防火墻安全優先級的描述&#xff0c;錯誤的是哪一項&#xff1f; A&#xff1a;不新建與默認安全區域同名的安全區域 B&#xff1a;同一系統中&#xff0c…

「服務器」Nginx詳解

本文主要介紹Nginx的原理和服務器部署Node.js項目。 一、Nginx原理 Nginx是一個高性能的HTTP服務器和反向代理服務器&#xff0c;它以高穩定性、豐富的功能集、簡單的配置和低資源消耗而聞名。以下是對Nginx的一些詳解&#xff1a; 1. Nginx是什么&#xff1f; Nginx&#x…

鑷子蠟燭如何設置止盈止損?Anzo Capital昂首資本盈利收場

通過上一篇文章各位聰明的投資者&#xff0c;都已經知道了什么是鑷子蠟燭圖以及如何抓住反轉進行交易&#xff0c;同時也有很多投資者不知道如何設置止盈止損&#xff1f;今天Anzo Capital昂首資本就和各位投資者一起探討如何盈利收場。 看跌的鑷子模式如何交易&#xff1f;首…

【數據結構】樹(Tree)

???專欄&#xff1a;數據結構 &#x1f9d1;?&#x1f393;個人主頁&#xff1a;SWsunlight 目錄 一、基本概念&#xff1a; 1、定義&#xff1a; ?編輯 ?編輯 2、樹的成分&#xff1a; 3、樹的性質&#xff1a; 二、存儲方式&#xff1a; ?編輯 雙親表示法…

C++-float與double

float和double是兩種不同的數據類型&#xff0c;用于存儲浮點數&#xff08;小數&#xff09;。 1.精度&#xff1a; float是單精度浮點數&#xff0c;占用4個字節&#xff0c;通常精度為6-9位小數。 double是雙精度浮點數&#xff0c;占用8個字節&#xff0c;通常精度為15-…

Open3D 點云多平面探測(Python)

文章目錄 一、簡介二、實現代碼三、實現效果參考資料一、簡介 Open3D為我們提供了一種點云多平面探測的算法,該算法使用基于魯棒統計的方法進行平面補丁檢測。該算法具體過程:首先將點云細分為更小的塊(使用八叉樹),然后嘗試為每個塊匹配一個平面。如果平面通過了魯棒平面性…

【C語言每日題解】用函數來模擬實現strlen()、strcpy()、strcmp()、strcat()

&#x1f970;歡迎關注 輕松拿捏C語言系列&#xff0c;來和 小哇 一起進步&#xff01;? 學習了函數后&#xff0c;老師讓我們用函數來實現上面這四個字符串函數。 我們首先來了解一下這四個字符串函數&#xff1a; 1.strlen函數 用于獲取字符串長度&#xff08;不包括末尾…

【源碼】相親交友系統全新UI/情感測試/婚慶中介/交友系統

【交友】相親交友系統全新UI/情感測試/婚慶中介/交友系統 帶商城&#xff0c;情感測試。 https://www.52codes.cc/codes/qt

從開發板導出根文件系統并修改(Ubuntu)

前面提到過基于ubuntu-base去構建根文件系統基于Ubuntu-base構建根文件系統-CSDN博客&#xff0c;但是有時候我們并不需要重頭開始&#xff0c;可以基于現有的根文件系統做調整。又或者我們直接在出廠的系統上去搭建好自己的運行環境并且編譯出自己想要的程序&#xff0c;現在要…

醫學科技查新中對查新點的撰寫方法!附案例講解!

我國的科技查新工作最早是從醫學領域開始的&#xff0c;始于1985年中國科學院醫學情報所&#xff0c;后來逐步發展到工、農等其 他各個領域。醫學科技查新包括立項查新和成果查新兩個部分&#xff0c;其中醫學立項查新&#xff0c;它是指在醫學科研項目申報開題之前&#xff0c…