首頁 後端開發 C#.Net教程 構造函數不能為虛函數

構造函數不能為虛函數

Dec 20, 2016 pm 04:48 PM
.net

構造函數不能宣告為虛函數的原因:

    1,所謂虛函數就是多態情況下只執行一個,而從繼承的概念來講,總是先構造父類對象,然後才能使子類對象,如果建構函式設為虛函數,那麼你在建構父類別的建構函式時就必須顯式的呼叫構造,還有一個原因就是為了防錯誤的發生,試想如果你在子類別中一不小心重寫了個跟父類別建構函數一樣的函數,那麼你的父類別建構子將會被覆蓋,也也就是不能完成父類別的構造,就會出錯。

class A
{
      public :
      virtual A()
     }
             
};
class B: public A
{
       
             cout          cout          cout       }

      派生類別繼承從而產生多態,衍生類別的建構函式中,編譯器會加入建構基底類別的程式碼,如果基底類別的建構函式用到了參數,則衍生類別在其建構函式中必須為基底類別給出參數,就是這個原因,原因有點繞,就是說如果派生類別的建構子必須跟父類別一摸一樣,這顯然是不符合實際的

當然還有其他的解釋:1,從儲存空間角度,虛函數對應一個vtable,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函數是虛的就需要透過vtable來調用,可是物件還沒有實例化,也就是記憶體空間還,沒有,無法找到vtable,所以建構子不能為虛函數。

2,從使用角度 虛函數主要用於在資訊不全的情況下,能使重載的函數得到對應的呼叫。建構函式本身就是要初始化實例,那使用虛函式也就沒有實例意義了,最開始的實例都沒有初始化,何來多態呢。虛擬函數的作用於透過父類別的指標或引用來呼叫它的時候能夠變成呼叫子類別的那個成員函數。而建構函數實在創建物件的時候自動調用的,不可能透過父類別的指標或引用去調用,因此規定建構函式不能為虛函數。

3,從實作上看,vtable在建構函數呼叫後才建立,因而建構函數不可能為虛函數,從實際意義上看,在呼叫建構子時還不能確定物件的真實型別(子類別要調用父類別的建構子),而且建構函式提供初始化,物件生命期只執行一次,不是物件的動態行為,也沒有太大必要成為虛函數。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
威爾R.E.P.O.有交叉遊戲嗎?
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

C#的就業前景如何 C#的就業前景如何 Oct 19, 2023 am 11:02 AM

無論您是初學者還是有經驗的專業人士,掌握C#將為您的職業發展鋪平道路。

分享幾個.NET開源的AI和LLM相關專案框架 分享幾個.NET開源的AI和LLM相關專案框架 May 06, 2024 pm 04:43 PM

當今人工智慧(AI)技術的發展如火如荼,它們在各個領域都展現了巨大的潛力和影響力。今天大姚給大家分享4個.NET開源的AI模型LLM相關的專案框架,希望能為大家提供一些參考。 https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.mdSemanticKernelSemanticKernel是一種開源的軟體開發工具包(SDK),旨在將大型語言模型(LLM)如OpenAI、Azure

面向開發人員的.NET效能最佳化技術 面向開發人員的.NET效能最佳化技術 Sep 12, 2023 am 10:43 AM

如果你是.NET開發者,你必須意識到在交付高品質軟體方面,優化功能和效能的重要性。透過熟練使用提供的資源並減少網站載入時間,你不僅為使用者創造了愉快的體驗,還能減少基礎設施成本。

Java框架與.NET框架的效能差異 Java框架與.NET框架的效能差異 Jun 03, 2024 am 09:19 AM

在高並發請求處理方面,.NETASP.NETCoreWebAPI效能優於JavaSpringMVC,原因包括:AOT提前編譯,減少啟動時間;更精細的記憶體管理,由開發人員負責分配和釋放物件記憶體。

C#.NET面試問題和答案:提高您的專業知識 C#.NET面試問題和答案:提高您的專業知識 Apr 07, 2025 am 12:01 AM

C#.NET面試問題和答案包括基礎知識、核心概念和高級用法。 1)基礎知識:C#是微軟開發的面向對象語言,主要用於.NET框架。 2)核心概念:委託和事件允許動態綁定方法,LINQ提供強大查詢功能。 3)高級用法:異步編程提高響應性,表達式樹用於動態代碼構建。

高級C#.NET教程:ACE您的下一次高級開發人員面試 高級C#.NET教程:ACE您的下一次高級開發人員面試 Apr 08, 2025 am 12:06 AM

C#高級開發者面試需要掌握異步編程、LINQ、.NET框架內部工作原理等核心知識。 1.異步編程通過async和await簡化操作,提升應用響應性。 2.LINQ以SQL風格操作數據,需注意性能。 3..NET框架的CLR管理內存,垃圾回收需謹慎使用。

C#.NET:探索核心概念和編程基礎知識 C#.NET:探索核心概念和編程基礎知識 Apr 10, 2025 am 09:32 AM

C#是一種現代、面向對象的編程語言,由微軟開發並作為.NET框架的一部分。 1.C#支持面向對象編程(OOP),包括封裝、繼承和多態。 2.C#中的異步編程通過async和await關鍵字實現,提高應用的響應性。 3.使用LINQ可以簡潔地處理數據集合。 4.常見錯誤包括空引用異常和索引超出範圍異常,調試技巧包括使用調試器和異常處理。 5.性能優化包括使用StringBuilder和避免不必要的裝箱和拆箱。

c#.net適合您嗎?評估其適用性 c#.net適合您嗎?評估其適用性 Apr 13, 2025 am 12:03 AM

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

See all articles