構造函數為什么不能是虛函數 ( 轉載自C/C++程序員之家)

  1. 從存儲空間角度,虛函數對應一個指向vtable虛函數表的指針,這大家都知道,可是這個指向vtable的指針其實是存儲在對象的內存空間的。問題出來了,如果構造函數是虛的,就需要通過 vtable來調用,可是對象還沒有實例化,也就是內存空間還沒有,怎么找vtable呢?所以構造函數不能是虛函數。
  2. 從使用角度,虛函數主要用于在信息不全的情況下,能使重載的函數得到對應的調用。構造函數本身就是要初始化實例,那使用虛函數也沒有實際意義呀。所以構造函數沒有必要是虛函數。虛函數的作用在于通過父類的指針或者引用來調用它的時候能夠變成調用子類的那個成員函數。而構造函數是在創建對象時自動調用的,不可能通過父類的指針或者引用去調用,因此也就規定構造函數不能是虛函數。
  3. 構造函數不需要是虛函數,也不允許是虛函數,因為創建一個對象時我們總是要明確指定對象的類型,盡管我們可能通過實驗室的基類的指針或引用去訪問它但析構卻不一定,我們往往通過基類的指針來銷毀對象。這時候如果析構函數不是虛函數,就不能正確識別對象類型從而不能正確調用析構函數。
  4. 從實現上看,vbtl在構造函數調用后才建立,因而構造函數不可能成為虛函數從實際含義上看,在調用構造函數時還不能確定對象的真實類型(因為子類會調父類的構造函數);而且構造函數的作用是提供初始化,在對象生命期只執行一次,不是對象的動態行為,也沒有必要成為虛函數。
  5. ?當一個構造函數被調用時,它做的首要的事情之一是初始化它的VPTR。因此,它只能知道它是“當前”類的,而完全忽視這個對象后面是否還有繼承者。當編譯器為這個構造函數產生代碼時,它是為這個類的構造函數產生代碼——既不是為基類,也不是為它的派生類(因為類不知道誰繼承它)。所以它使用的VPTR必須是對于這個類的VTABLE。而且,只要它是最后的構造函數調用,那么在這個對象的生命期內,VPTR將保持被初始化為指向這個VTABLE, 但如果接著還有一個更晚派生的構造函數被調用,這個構造函數又將設置VPTR指向它的 VTABLE,等.直到最后的構造函數結束。VPTR的狀態是由被最后調用的構造函數確定的。這就是為什么構造函數調用是從基類到更加派生類順序的另一個理由。但是,當這一系列構造函數調用正發生時,每個構造函數都已經設置VPTR指向它自己的VTABLE。如果函數調用使用虛機制,它將只產生通過它自己的VTABLE的調用,而不是最后的VTABLE(所有構造函數被調用后才會有最后的VTABLE)。

?轉載自C/C++程序員之家

轉載于:https://www.cnblogs.com/csxcode/p/3740086.html

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

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

相關文章

小程序“自定義關鍵詞”功能的常見問答

我們知道小程序可以通過線下掃碼、公眾號、好友分享、長按小程序碼、搜索小程序名稱來找到,現在又多了一個新方式——小程序后臺新增自定義關鍵詞功能:已發布小程序的開發者,可提交最多10個與小程序業務相關的關鍵詞,幫助你的小程…

語義分割深度學習方法集錦

轉載:https://github.com/handong1587/handong1587.github.io/edit/master/_posts/deep_learning/2015-10-09-segmentation.md Papers Deep Joint Task Learning for Generic Object Extraction intro: NIPS 2014homepage: http://vision.sysu.edu.cn/projects/d…

員工培訓與開發實訓心得體會_公司新員工培訓心得體會800字范文

點擊藍字關注我們培訓是一次能夠快速提升我們的機會,而每個新員工也是通過培訓盡快的融入公司的。因此,我們要更加重視培訓一些!下面是小編為大家整理的公司新員工培訓心得體會,希望對大家有幫助。公司新員工培訓心得體會800字為了讓我們新進…

Nginx ab壓力測試

20-ab壓力測試及nginx性能統計模塊 優化的啟發,打開的文件太多 Nginx 錯誤日志顯示,打開文件數太多 系統層面 more /proc/sys/net/core/somaxconn 單個Nginx 測試index.html 沒優化前 [root/home/www]#ab -c 4000 -n 100000 http://test.demo.com/inde…

Code First02---CodeFirst配置實體與數據庫映射的兩種方式

Code First有兩種配置數據庫映射的方式,一種是使用數據屬性DataAnnotation,另一種是Fluent API.這兩種方式分別是什么呢?下面進行一一解釋:DataAnnotation的配置方式需要你給定義實體和值對象的類和類中的屬性加上與數據庫映射相關…

sigmoid函數的數值穩定性

在深度學習中,我們常常選用sigmoid函數作為激活函數。sigmoid函數的具體形式如下: f(x)11e?xf(x)=\frac{1}{1+e^{-x}}曲線表示為: 再畫大一點,取x區間更大一些,則為: 顯然從圖像上看,sigmoid函…

查看CentOS版本方法

有以下命令可以查看: # lsb_release -a LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarchDistributor ID: CentOSDescription: CentOS release 5.4 (Final)Release: 5.4Codename: Final這個命令適用于所有的li…

windows遠程連接ubuntu 黑屏_Windows跟Windows遠程連接傳輸文件

關注奕奇科技,學習更多小妙招電腦小知識,值得收藏我們一般在使用windows遠程連接時需要傳輸文件該怎么辦?我們可以插入U盤導入導出,但這樣很是麻煩而且如果身邊暫時沒有U盤的情況就要通過社交工具傳播文件,大的文件也更…

思維導圖分析http之前端組成

思維導圖分析http前端組成全文總覽本文分為三個部分:前端組成,http協議,http服務器應用程序。http的應用按照我自己的理解分為前端應用以及后端應用,所以我分別寫了前端組成以及http服務器應用程序兩章,中間穿插了一章…

Linux命令工具基礎02 文件及目錄管理

文件及目錄管理 文件管理不外乎文件或目錄的創建、刪除、查詢、移動,有mkdir/rm/mv 文件查詢是重點,用find來進行查詢;find的參數豐富,也非常強大; 查看文件內容是個大的話題,文本的處理有太多的工具供我們…

caffe 關于Deconvolution的初始化注意事項

對于fcn,經常要使用到Deconvolution進行上采樣。對于caffe使用者,使用Deconvolution上采樣,其參數往往直接給定,不需要通過學習獲得。 給定參數的方式很有意思,可以通過兩種方式實現,但是這兩種方式并非完…

多目標進化優化_SDIM 學術講座|分解多目標優化與帕累托多任務學習

分解多目標優化與帕累托多任務學習2020年11月4日晚,香港城市大學電腦學系講座教授、博士生導師、IEEE Fellow張青富教授應我院王振坤教授的邀請,在線舉辦了一場主題為“分解多目標優化與帕累托多任務學習”的學術講座。此次講座采用線上和線下兩種渠道&a…

hibernate(nested transactions not supported)異常

org.hibernate.TransactionException: nested transactions not supported錯誤的解決方法! 原因:事務沒有提交,事務提交后正常 Transaction tx session.beginTransaction(); tx.commit(); //缺少這句話轉載于:https://www.cnblogs.com/lmq-1…

Ubuntu使用Windows下的conio.h

把虛線框里面的內容粘貼進文檔文本里面 ---------------------------------------------------------------------------------------------------------- #include <termios.h>#include <stdio.h>static struct termios old, new;/* Initialize new terminal i/o …

安裝oracle-java,并覆蓋原先的OpenJDK

Centos默認安裝openJDK只安裝了java,沒有安裝javac.如果需要安裝javac&#xff0c;需要install the openjdk-8-jdk package。參考&#xff1a;http://openjdk.java.net/install/ 為了完整地安裝java&#xff0c;我們轉而選擇使用oracle-java&#xff0c;由于我們沒有root權限&a…

反射創建對象_如何應用Java反射技術靈活地創建程序類的對象實例

軟件項目實訓及課程設計指導——如何應用Java反射技術靈活地創建程序類的對象實例1、如何應用屬性配置文件實現對系統中的配置信息進行讀寫操作Java中的屬性配置文件主要可以作為軟件應用系統及項目的配置文件&#xff0c;比如許多J2EE的開源框架系統中都提供了屬性配置文件作為…

js回到頂部

2019獨角獸企業重金招聘Python工程師標準>>> <html xmlns"http://www.w3.org/1999/xhtml"> <head runat"server"> <title></title> <style type"text/css"> #control_pannel …

java 產生的固體物的基礎上 增刪改的SQL聲明

經過多次修改。最后版本。package com.power.sql;import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.List; import java.util.Vector;import org.apache.commons.lang3.reflect.FieldUtils; /*** author Gary Huang* 博客地址&#xff1a;…

OSEK簡介

What is OSEKA specification for an RTOS?With standard software interfaces (OS API)?Including intertask & interprocessor communication (COM)?Including network management (NM)?Including the language used to statically declare OS elements used in an a…

python中布爾型的值_在python中對于bool布爾值的取反操作

背景根據公司業務的需求&#xff0c;需要做一個對于mysql數據庫的大批量更新。腳本嘛也是干干單單。使用了redis的隊列做緩存&#xff0c;可以異步并發的多任務進行更新。有點難受的地方在于&#xff0c;請求訪問時&#xff0c;因為一些網速&#xff0c;速率之內的原因&#xf…