解構函式為什麼不能宣告為虛擬函式?解構函式為什麼要宣告為虛擬函式
多型中的虛擬函式表是在執行時建立的還是編譯時建立的?
答:虛擬函式表在編譯的時候就確定了,而類物件的虛擬函式指標vptr是在執行階段確定的,這是實現多型的關鍵
(類的函式的呼叫並不是在編譯時就確定的,而是在執行時才確定的,由於編寫程式碼的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以宣告為虛擬函式。虛擬函式和虛擬函式表是兩個不同的東西,虛擬函式的呼叫是在執行時才確定的,虛擬函式表是在編譯時就已經確定的了 。)
為什麼建構函式不能宣告為虛擬函式?
1.建立一個物件必須明確指出它的型別,否則無法建立,一個物件建立成功編譯器獲得它的實際型別,然後去呼叫對應的函式,而如果建構函式宣告為虛擬函式,會形成一個死鎖,虛擬函式是在執行才能確定確定其呼叫哪一個型別的函式,而具體哪一個型別是編譯器通過物件的型別去確定的,但是此時物件還未建立也就沒法知道其真實型別。
2.虛擬函式對應一張虛擬函式表,這個虛擬函式表是儲存在物件的記憶體空間的,如果建構函式是虛擬函式就需要通過虛擬函式表來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,找不到虛擬函式表,所以建構函式是不能宣告為虛擬函式的。
相關推薦
解構函式為什麼不能宣告為虛擬函式?解構函式為什麼要宣告為虛擬函式
多型中的虛擬函式表是在執行時建立的還是編譯時建立的? 答:虛擬函式表在編譯的時候就確定了,而類物件的虛擬函式指標vptr是在執行階段確定的,這是實現多型的關鍵 (類的函式的呼叫並不是在編譯時就確定的,而是在執行時才確定的,由於編寫程式碼的時候並不能確定被呼叫的是基類的函式還是哪個派生類的函式,所以宣告為虛
c++為什麼解構函式要寫成虛擬函式
//base_derive.cpp #include <iostream> #include <memory> using namespace std; class Base{ public: Base(){cout << "Base" <&l
從零開始學C++之虛擬函式與多型(一):虛擬函式表指標、虛解構函式、object slicing與虛擬函式、C++物件模型圖
#include <iostream>using namespace std;class CObject {public: virtual void Serialize() { cout << "CObject::Serialize ..." <&
C++ 第六章(多型性和虛擬函式)下篇(虛解構函式和純虛擬函式)
一,虛解構函式 如果用new運算子建立了臨時物件,若基類中有解構函式並且定義了一個指向該基類的指標變數。在程式用帶指標引數的delete運算子撤銷物件時,會發生:系統只執行基類的解構函式,而不執行派生類的解構函式。 #include<iostream> using
C++學習:虛擬函式,純虛擬函式(virtual),虛繼承,虛解構函式
C++學習:虛擬函式,虛繼承,純虛擬函式(virtual)虛解構函式 虛擬函式 純虛擬函式 虛解構函式 虛繼承 簡介 在java這種高階語言中,有abstract和interface這兩個關鍵字.代表的是抽象類和介面,但是在C++這門語言中
C++中virtual(虛擬函式)的用法詳解
在面向物件的C++語言中,虛擬函式(virtual function)是一個非常重要的概念。因為它充分體現了面向物件思想中的繼承和多型性這兩大特性,在C++語言裡應用極廣。比如在微軟的MFC類庫中,你會發現很多函式都有virtual關鍵字,也就是說,它們都是虛擬函式。難怪有人甚至稱虛擬函
ES6學習 --函式引數預設值與解構賦值預設值
1. ES6的解構ES6中引入瞭解構賦值的操作,其作用是:將值從陣列Array或屬性從物件Object提取到不同的變數中 即分為兩種情況:從陣列Array中解構,以及從物件Object中解構 ①.從陣列中解構const [a, b] = [1, 2]//a = 1, b = 2當然這些是基本的陣列解構賦值
ES6 常用功能總結(箭頭函式、let/const、解構賦值、模板字串、Promise物件等)
let關鍵字 作用:與var類似,用於宣告一個變數 與var不同:let所宣告的變數,在塊級作用域內有效,也就是隻在它所在的程式碼塊有效 { let a = 100; var b = 10; } console.log(a); //undefined
c++單鏈表【建構函式、運算子過載、解構函式、增刪查改等】
c++中的單向連結串列寫法:實現增刪查改、建構函式、運算子過載、解構函式等。建立標頭檔案SList.h#pragma once typedef int DataType; //SList要訪問SListNode,可以通過友元函式實現,友元函式在被訪問的類中 class SL
解構函式的作用及合成解構函式
解構函式 用於釋放在建構函式或在物件生命期內獲取的資源。 如果類需要解構函式,那麼也需要複製操作符和複製建構函式。 何時呼叫解構函式? 當物件的引用或指標超出作用域時,不會執行解構函式,只有刪除指向動態分配物件的指標或實際物件(而不是物件的引用)超出作用域時,才會執行解構函
C++中的虛擬函式(表)實現機制詳解
前言大家都應該知道C++的精髓是虛擬函式吧? 虛擬函式帶來的好處就是: 可以定義一個基類的指標, 其指向一個繼承類, 當通過基類的指標去呼叫函式時, 可以在執行時決定該呼叫基類的函式還是繼承類的函式. 虛擬函式是實現多型(動態繫結)/介面函式的基礎. 可以說: 沒有虛擬函式,
C++筆記之為什麼一個類定義了解構函式就幾乎肯定要定義拷貝建構函式和拷貝賦值運算子
這個問題本來很簡單,但是時間久了就容易忘,所以做個筆記用來提示下自己 先來看看這樣一個類: class HasPtr { public: HasPtr(const string& s = string()) :ps(new string(s)), i(0) {
函式的呼叫過程詳解———棧幀的建立和銷燬
●回顧內容: 函式的定義:函式是一個程式中的部分程式碼,由一個或多個語句組成,它的功能是實現某些特定的任務。函式相對於其他程式碼來說具備相對的獨立性。 函式的呼叫:在某個函式內部,使用另一個函式來完成相關的任務,這個過程叫做函式呼叫。 那麼函式是如何呼叫的呢?分析一段簡單的程式碼:
Vue鉤子函式生命週期例項詳解
vue生命週期簡介 Vue例項有一個完整的生命週期,也就是從開始建立、初始化資料、編譯模板、掛載Dom、渲染→更新→渲染、解除安裝等一系列過程,我們稱這是Vue的生命週期。通俗說就是Vue例項從建立到銷燬的過程,就是生命週期。 在Vue的整個生命週期中,它提供了一系列的事件,可以讓我們在事件觸發時註冊js
初夏小談:函式 strchr 和 strcmp 詳解
實現和strchr(查詢字元首次出現的位置) #include<Aventador_SQ.h> int Strchr(char arr[], char Char,int* location) { int i = 0; int ArrLen = strlen(arr); int
Python零基礎入門之函式的修飾器詳解!
內嵌函式 要理解修飾器,首先要知道python的內嵌函式。 在函式內部可以建立另外一個函式,不過內部函式也只能在外部函式的作用域之內呼叫才有效。 如果內部函式定義中包含了外部函式定義的物件的引用,內部函式會被稱為閉包 私信小編007即可獲取小編精心準備的大禮包一份哦!
JavaScript函式(內建函式),變數詳解
JavaScript函式(內建函式),變數詳解 &nb
C++ 函式指標及其作用詳解
查了很多資料,對函式指標已瞭解。 函式指標指向某種特定型別,函式的型別由其引數及返回型別共同決定,與函式名無關。舉例如下: int add(int nLeft,int nRight);//函式定義 該函式型別為int(
Python-24_綜合練習-01_函式_檔案處理_解耦--查詢功能
--------------------------------------------- 一、查詢功能:--------------------------------------------- def fetch(data): print("\033[1;43m查詢功能\033[0m")
資料庫日期運算函式及Type值詳解
資料庫日期運算函式及Type的期望值 函式DATE_ADD()和DATE_SUB() 前言: 在MySQL資料庫中,我們經常使用日期函式,基本上建立一個數據庫(非測試),我們對日期的使用都是必不可少的,下面我就說一下MySQL資料庫中的日期運算函式以及函式中的Type