1. 程式人生 > >為什麼建構函式不能為虛擬函式,而解構函式可以為虛擬函式?

為什麼建構函式不能為虛擬函式,而解構函式可以為虛擬函式?

1. 為什麼建構函式不能為虛擬函式?    虛擬函式的呼叫需要虛擬函式表指標,而該指標存放在物件的內容空間中;若建構函式宣告為虛擬函式,那麼由於物件還未建立,還沒有記憶體空間,更沒有虛擬函式表地址用來呼叫虛擬函式——構造函數了。 2. 為什麼解構函式可以為虛擬函式,如果不設為虛擬函式可能會存在什麼問題?    首先解構函式可以為虛擬函式,而且當要使用基類指標或引用呼叫子類時,最好將基類的解構函式宣告為虛擬函式,否則可以存在記憶體洩露的問題。     舉例說明:     子類B繼承自基類A;A *p = newB; delete p;     1)此時,如果類A的解構函式不是虛擬函式,那麼deletep;將會僅僅呼叫A的解構函式,只釋放了B物件中的A部分,而派生出的新的部分未釋放掉。     2) 如果類A的解構函式是虛擬函式,deletep; 將會先呼叫B的解構函式,再呼叫A的解構函式,釋放B物件的所有空間。     補充: B *p = new B; deletep;時也是先呼叫B的解構函式,再呼叫A的解構函式。

相關推薦

為什麼建構函式不能虛擬函式函式可以虛擬函式

1. 為什麼建構函式不能為虛擬函式?    虛擬函式的呼叫需要虛擬函式表指標,而該指標存放在物件的內容空間中;若建構函式宣告為虛擬函式,那麼由於物件還未建立,還沒有記憶體空間,更沒有虛擬函式表地址用來呼叫虛擬函式——構造函數了。 2. 為什麼解構函式可以為虛擬函式,如果不

${User.uname} 在頁面上怎麼顯示${User.uname} 不是顯示存在作用域的使用者名稱?

可能是servlet的版本問題? 檢視 web.xml檔案的配置,如果版本是2.3的是不行的(預設不支援el表示式), 你可以把web.xml的開頭,改成下面的樣子: <?xml version="1.0" encoding="UTF-8"?> <web-a

函式設定虛擬函式並且函式可以虛擬函式

為什麼基類的解構函式是虛擬函式?   在實現多型時,當用基類操作派生類,在析構時防止只析構基類而不析構派生類的狀況發生。 但如果不需要基類對派生類及物件進行操作,則不能定義虛擬函式,因為這樣會增加記憶體開銷.當類裡面有定義虛擬函式的時候,編譯器會給類新增一個虛擬函式表,裡面

C++在單繼承、多繼承、虛繼承時建構函式、複製建構函式、賦值操作符、函式的執行順序和執行內容

一、本文目的與說明     1. 本文目的:理清在各種繼承時,建構函式、複製建構函式、賦值操作符、解構函式的執行順序和執行內容。     2. 說明:雖然複製建構函式屬於建構函式的一種,有共同的地方,但是也具有一定的特殊性,所以在總結它的性質時將它單獨列出來了。  

27.能否在建構函式中丟擲異常?函式呢?

首先,我們要明確一點!一個函式執行的過程中,如果丟擲異常,會導致函式提前終止! 在C++建構函式中,既需要分配記憶體,又需要丟擲異常時要特別注意防止記憶體洩露的情況發生。因為在建構函式中丟擲異常,在概念上將被視為該物件沒有被成功構造,因此當前物件的解構函式就不會被呼叫。同時

ili9486液晶驅動函式8位模式使用PB0到PB7資料口初始化、讀點函式、寫點函式

void LCD_INIT_ILI9486(void) {     LCD_GPIOInit();          //************* Reset LCD Driver ****************//     LCD_RST_SET;    delay_m

[收集]c++抽象類、純虛擬函式以及巧用純虛函式實現介面類

在Java、C#中有關鍵詞abstract指明抽象函式、抽象類,但是在C++中沒有這個關鍵詞,很顯然,在C++也會需要只需要在基類宣告某函式的情況,而不需要寫具體的實現,那C++中是如何實現這一功能的,答案是純虛擬函式。 含有純虛擬函式的類是抽象類,不能生成物件,只能派生。

【C#】datetimepicker裡面如何設定日期當天日期時間設0:00或23:59?

今天無意中發現要根據日期查詢時間,datatimepicker控制元件會把時間預設成當前時間(當你的控制元件只顯示日期時),這樣查詢出來的出來的資料會有誤差,用來下面的辦法成功設定日期為當天日期,而時間設為0:00或23:59。 1 2 3 4 5 6 /

C++中基類的函式為什麼要用virtual虛函式【轉】

(轉自:https://blog.csdn.net/iicy266/article/details/11906457) 知識背景          要弄明白這個問題,首先要了解下C++中的動態繫結。&n

es6常用的新特性 let,const,class,模版字串,賦值,箭頭函式,for-of, keys values entries, export import, async await

let const class var命令和function命令宣告的全域性變數,依舊是頂層物件的屬性; 另一方面規定,let命令、const命令、class命令宣告的全域性變數,不屬於頂層物件的屬性。 也就是說,從ES6開始,全域性變數將逐步與頂層物件的屬性脫

ES6小技巧 - 使用賦值設定函式引數預設值

本文要說的並不是下面這種ES6的函式引數預設值: function fn(a = 0, b = 1) {} 複製程式碼 很多時候,我們在寫一個建構函式時,可能需要傳入很多引數,這時候就不可能使用函式引數一個一個的傳入,而是傳入一個物件當作引數。 舉個例子:一個函式,引數傳入一個物件,物件裡可以設定兩個屬性

C++中基類的函式為什麼要用virtual虛函式

知識背景          要弄明白這個問題,首先要了解下C++中的動態繫結。  正題          直接的講,C++中基類採用virtual虛解構函式是為了防止記憶體洩漏。具體地說,如果派生類中申請了記憶體空間,並在其解構函式中對這些記憶體空間進行釋放

Date類為什麼設計可變的不是像String一樣?

首先,不得不承認,這確實是類庫設計的一個錯誤,所以“為什麼”進行了這個錯誤設計並沒有意義。但沒有事物一誕生就是完美的,我們的Java只是反應的慢了一點,再慢了一點。 更何況,Date類等日期/時間API又不是隻有這一個問題。 Java8之前,日期/時

jquery 複選框如果選中就不選中如果不選中就選中。

唉,生活無樂趣,程式碼更加無樂趣。每天一遍文章,督促自己要學習,要寫程式碼。 $("#checkboxAll").bind("click",function(){ //繫結一個事件 var checkboxs=$("[name=checkboxa]"); //找到name=c

destructuring-array陣列賦值!

BUG未知... function destructuringArray(target, arr, exp) { try { exp = exp.replace(/((\.{3})?\w+)/g, ($0, $1) =

機器人行走( * 某少年宮引進了一批機器人小車。可以接受預先輸入的指令按指令行動。小車的基本動作很簡單只有3種:左轉(記L)右轉(記R)向前走若干釐米(直接記數字)。 例如我們)

/** * 某少年宮引進了一批機器人小車。可以接受預先輸入的指令,按指令行動。小車的基本動作很簡單,只有3種:左轉(記為L),右轉(記為R),向前走若干釐米(直接記數字)。 例如,我們可以對小車輸入如下的指令: 15L10R5LRR10R20 則,小車先

機器人行走 某少年宮引進了一批機器人小車。可以接受預先輸入的指令按指令行動。小車的基本動作很簡單 只有3種:左轉(記L)右轉(記R)向前走若干釐米(直接記數字)。

/*機器人行走 * 【程式設計題】(滿分18分) 某少年宮引進了一批機器人小車。可以接受預先輸入的指令,按指令行動。小車的基本動作很簡單, 只有3種:左轉(記為L),右轉(記為R),向前走若干釐米(直接記數字)。 例如,我們可以對小車輸入如下的指令

(二)證明數列{(1+1/n)^(n+1)}遞減數列{(1+1/n)^(n)}遞增數列

1. 利用不等式bn+1−an+1>(n+1)an(b−a),b>a>0證明 {(1+1n)n+1} 為遞減數列 證明: 由 bn+1−an+1>(n+1)an(b−a) 可得 bn+1>[(n+1)(b−a)+a]

在雲伺服器上安裝虛擬機器再通過xshell訪問到虛擬機器中的linux

這個題有點繞哈這是一次異想天開的行動,當時是需要安裝fastDfs圖片伺服器的,但是不想安裝,手裡又有圖片伺服器的虛擬機器壓縮包,於是在阿里雲買了一臺windows伺服器一個月試試水,如下這是在5月份,讀大二,大二下學期,也就是一個多月後就要去找實習了,嘿嘿,我的專案需要用到