<六>關於虛函數和動態綁定

来源:https://www.cnblogs.com/erichome/archive/2022/11/28/16931516.html
-Advertisement-
Play Games

問題:是不是虛函數的調用就一定是動態綁定?不是的 1:在類的構造函數當中,調用虛函數,也是靜態綁定(構造函數中對虛函數的調用不發生動態綁定) 2:如果不是通過指針或者引用變數來調用虛函數,那就是靜態綁定 代碼1 class Base { public: Base(int data=10):ma(da ...


問題:是不是虛函數的調用就一定是動態綁定?不是的
1:在類的構造函數當中,調用虛函數,也是靜態綁定(構造函數中對虛函數的調用不發生動態綁定)
2:如果不是通過指針或者引用變數來調用虛函數,那就是靜態綁定

代碼1

class Base
{
public:
	Base(int data=10):ma(data){
	   cout<<"Base()"<<endl;
        }
	//虛函數
	virtual void show(){cout<<"Base Show()"<<endl;}
	//虛函數
	virtual void show(int){cout<<"Base Show(int)"<<endl;}
	~Base(){cout<<"~Base()"<<endl;}
protected:
	int ma;
};

class Derive : public Base
{
	public:
	 Derive(int data=20):Base(data),mb(data){
	      cout<<"Derive()"<<endl;
	 }
	void show(){cout<<"Derive Show()"<<endl;}
        ~Derive(){cout<<"~Derive()"<<endl;}
	private:
        int mb;
};

int main(){
	 
	 Base b(10);
	 Derive d(20);
         b.show();//通過對象調用,靜態綁定,不發生多態
	 d.show();//通過對象調用,靜態綁定,不發生多態
	 //想一想為什麼? b.show()如果發生動態綁定,b訪問自己的虛函數表,自己虛函數表的show方法是自己Base的void show()方法的方法地址
         //d.show() 如果發生動態綁定,d訪問自己的虛函數表,自己虛函數表的show方法是自己Derive的void show()的方法地址
         //訪問的都是屬於自己的函數地址,沒有必要去走動態綁定機制
	

         //動態綁定,必須通過指針調用虛函數,因為指針本身自己不知道自己指向了什麼,所以要調什麼方法就必須通過動態綁定來定位最終調用什麼方法,這才有意義
         Base *pb=&b;
	 Base *pb=&d;
         pb->show();//發生動態綁定
         pb->show();//發生動態綁定

        //動態綁定,必須通過引用調用虛函數
         Base &rb1=b;
         rb1.show();//發生動態綁定
        
         Base &rd1=d;
         rd1.show();//發生動態綁定

         return 0; 
        
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目標:爬取xx二手房樓市信息自己分析形勢 目的:記錄重溫爬蟲歷程 1、引用包requests,random,time,pandas,bs4 2、查詢:bs4使用方法,re。comple,以及他山之石。 3、思路:簡單應用,直接寫死不用def,class, -url 列表,初始列表後,append添加 ...
  • 併發編程Bug的源頭:可見性、原子性和有序性問題。 「CPU、記憶體、磁碟之間的速度差異」 - 為了能同時執行多個任務,CPU 發展出時間片輪轉、多核等 - CPU 要從記憶體中讀數據太慢了,所以給自己設置了緩存 - CPU 讀磁碟更慢了,所以可以讓該線程阻塞 ...
  • GCC struct 記憶體對齊規則 結構體起始地址需要被其中成員類型最大的大小所整除; 每個成員起始地址需要被其類型大小所整除,如int32_t類型成員記憶體對齊到4B; 如果成員有子結構體,則該子結構體成員起始地址要被其內部成員類型最大的所整除。如struct a里存有struct b,b 里有 c ...
  • 理解多態 多種多樣的形態(靜態多態,動態多態) 靜態多態(編譯時期) 1:函數重載 bool comparet(int ,int); bool compare(double,double); compare(100,100)->compare_int_int(); compare(1.0,2.0)- ...
  • 打包下載成.zip文件 項目背景 公司使用vue + SpringBoot實現批量下載功能 今天在調試批量下載這個功能。打包成.zip文件時,在返回給前端瀏覽器出現報錯信息: 後端報錯: ERROR c.c.p.c.e.BusinessExceptionHandler - java.io.IOExc ...
  • 抽象類和普通類有什麼區別? 抽象類一般不用作抽象實體類型 一般把上面類設計為抽象類? 基類 定義抽象類的唯一目的, 就是去建立派生類. 我們在抽象類基礎上要定義出功能各異的派生類, 再用這些派生類去建立對象. 凡是包含純虛函數的類都是抽象類. 純虛函數不用實現, 故不能被調用, 抽象類無法建立對象. ...
  • JZ12 矩陣中的路徑 描述 請設計一個函數,用來判斷在一個n乘m的矩陣中是否存在一條包含某長度為len的字元串所有字元的路徑。路徑可以從矩陣中的任意一個格子開始,每一步可以在矩陣中向左,向右,向上,向下移動一個格子。如果一條路徑經過了矩陣中的某一個格子,則該路徑不能再進入該格子。 思路 我們看到他 ...
  • 本篇文章我們將進一步探討下Guava Cache 實現層面的一些邏輯與設計策略,讓我們可以對Guava Cache整體有個更加明朗的認識,促進實際使用中對其的理解。 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 當別人做大數據用Java、Python的時候,我使用.NET做大數據、數據挖掘,這確實是值得一說的事。 寫的並不全面,但都是實際工作中的內容。 .NET在大數據項目中,可以做什麼? 寫腳本(使用控制台程式+頂級語句) 寫工具(使用Winform) 寫介面、寫服務 使用C#寫代碼的優點是什麼? ...
  • 前言 本文寫給想學C#的朋友,目的是以儘快的速度入門 C#好學嗎? 對於這個問題,我以前的回答是:好學!但仔細想想,不是這麼回事,對於新手來說,C#沒有那麼好學。 反而學Java還要容易一些,學Java Web就行了,就是SpringBoot那一套。 但是C#方向比較多,你是學控制台程式、WebAP ...
  • 某一日晚上上線,測試同學在回歸項目黃金流程時,有一個工單項目介面報JSF序列化錯誤,馬上升級對應的client包版本,編譯部署後錯誤消失。 線上問題是解決了,但是作為程式員要瞭解問題發生的原因和本質。但這都是為什麼呢? ...
  • 本文介紹基於Python語言中TensorFlow的Keras介面,實現深度神經網路回歸的方法。 1 寫在前面 前期一篇文章Python TensorFlow深度學習回歸代碼:DNNRegressor詳細介紹了基於TensorFlow tf.estimator介面的深度學習網路;而在TensorFl ...
  • 前段時間因業務需要完成了一個工作流組件的編碼工作。藉著這個機會跟大家分享一下整個創作過程,希望大家喜歡,組件暫且命名為"easyFlowable"。 接下來的文章我將從什麼是工作流、為什麼要自研這個工作流組件、架構設計三個維度跟大家來做個整體介紹。 ...
  • 1 簡介 我們之前使用了dapr的本地托管模式,但在生產中我們一般使用Kubernetes托管,本文介紹如何在GKE(GCP Kubernetes)安裝dapr。 相關文章: dapr本地托管的服務調用體驗與Java SDK的Spring Boot整合 dapr入門與本地托管模式嘗試 2 安裝GKE ...
  • 摘要:在jvm中有很多的參數可以進行設置,這樣可以讓jvm在各種環境中都能夠高效的運行。絕大部分的參數保持預設即可。 本文分享自華為雲社區《為什麼需要對jvm進行優化,jvm運行參數之標準參數》,作者:共飲一杯無。 我們為什麼要對jvm做優化? 在本地開發環境中我們很少會遇到需要對jvm進行優化的需 ...
  • 背景 我們的業務共使用11台(阿裡雲)伺服器,使用SpringcloudAlibaba構建微服務集群,共計60個微服務,全部註冊在同一個Nacos集群 流量轉發路徑: nginx->spring-gateway->業務微服務 使用的版本如下: spring-boot.version:2.2.5.RE ...
  • 基於php+webuploader的大文件分片上傳,帶進度條,支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況)。文件上傳前先檢測該文件是否已上傳,如果已上傳提示“文件已存在”,如果未上傳則直接上傳。視頻上傳時會根據設定的參數(分片大小、分片數量)進行上傳,上傳過程中會在目標文件夾中生成一個臨 ...
  • 基於php大文件分片上傳至七牛雲,使用的是七牛雲js-sdk V2版本,引入js文件,配置簡單,可以暫停,暫停後支持斷點續傳(刷新、關閉頁面、重新上傳、網路中斷等情況),可以配置分片大小和分片數量,官方文檔https://developer.qiniu.com/kodo/6889/javascrip ...