1. 程式人生 > >C++中為什麼建構函式不能定義為虛擬函式

C++中為什麼建構函式不能定義為虛擬函式

關於C++為什麼不支援虛擬建構函式,Bjarne很早以前就在C++Style and Technique FAQ裡面做過回答

Avirtual call is a mechanism to get work done given partialinformation. In particular, "virtual" allows us to call afunction knowing only an interfaces and not the exact type of theobject. To create an object you need complete information. Inparticular, you need to know the exact type of what you want tocreate. Consequently, a "call to a constructor" cannot bevirtual.

出處:Stroustrup: C++ Style and Technique FAQ

含義大概是這樣的:虛擬函式呼叫是在部分資訊下完成工作的機制,允許我們只知道介面而不知道物件的確切型別。 要建立一個物件,你需要知道物件的完整資訊。 特別是,你需要知道你想要建立的確切型別。 因此,建構函式不應該被定義為虛擬函式。

從C++之父Bjarne的回答我們應該知道C++為什麼不支援建構函式是虛函數了,簡單講就是沒有意義。虛擬函式的作用在於通過子類的指標或引用來呼叫父類的那個成員函式。而建構函式是在建立物件時自己主動呼叫的,不可能通過子類的指標或者引用去呼叫。

網路上還有一個很普遍的解釋是這樣的:虛擬函式相應一個指向vtable虛擬函式表的指標,但是這個指向vtable的指標事實上是儲存在物件的記憶體空間的。假設建構函式是虛的,就須要通過 vtable來呼叫,但是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?所以建構函式不能是虛擬函式。

本人對這個觀點並不認同,這主要是因為用什麼方式實現虛擬函式是編譯器的事情,使用Vtable只是大多數編譯器採用的一種手段,並不代表編譯器實現不了虛建構函式,編譯器之所以不支援虛建構函式主要原因就是沒有必要,所以正好這種實現方式也不支援,巧合而已
--------------------- 
作者:史立坤 
來源:CSDN 
原文:https://blog.csdn.net/shilikun841122/article/details/79012779 
版權宣告:本文為博主原創文章,轉載請附上博文連結!