關於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只是大多數編譯器采用的一種手段,並不代表編譯器實現不了虛構造函數,編譯器之所以不支持虛構造函數主要原因就是沒有必要,所以正好這種實現方式也不支持,巧合而已。