C++建構函式中不呼叫虛擬函式的原因
今天在看網上一篇帖子的時候看到這個問題,試講關於C++物件虛擬函式表和型別資訊的(RTTI)的,正好看到了如下內容:
這個是為什麼在建構函式中不能呼叫虛擬函式的原因 .因為任何時候在基類中的虛擬函式呼叫,都不可能到達子類的實現,因為子類的虛表初始化是在呼叫完基類的構造之後發生的. 因此在基類中呼叫虛擬函式永遠只能呼叫到自己的實現或者更基類的實現,不可能跳轉到子類的實現.
也就是說,如果你本類的建構函式中呼叫了虛擬函式,那麼也只能呼叫到你本類和你上層基類中的虛擬函式,而不可能調到你派生類中的虛擬函式實現。
因為建構函式的呼叫要麼是new一個本類物件,要不就是在new派生類的時候呼叫你本類的建構函式。
而在派生類中呼叫你本類建構函式的時候,該類(派生類)物件的虛擬函式表指標還只是指向了基類(也就是你寫的類)的虛擬函式表,因此,通過該虛擬函式表,你無法呼叫到派生類物件自己的虛擬函式,只有到基類建構函式完成的以後,虛擬函式表的指標才指向到派生類的自己的虛擬函式表。
附上原文地址:http://blog.sina.com.cn/s/blog_41299a970101fzfz.html
相關推薦
C++建構函式中不呼叫虛擬函式的原因
今天在看網上一篇帖子的時候看到這個問題,試講關於C++物件虛擬函式表和型別資訊的(RTTI)的,正好看到了如下內容: 這個是為什麼在建構函式中不能呼叫虛擬函式的原因 .因為任何時候在基類中的虛擬函式呼叫,都不可能到達子類的實現,因為子類的虛表初始化是在呼叫完基類的構造之後發
建構函式與解構函式中不呼叫虛擬函式
本文參考《effective C++》第九條款 在C++中,提倡不能在建構函式和解構函式中呼叫虛擬函式。 這是為什麼呢? 首先,我們先回顧一下C++虛擬函式的作用。 虛擬函式的引入是c++執行時多型的體現,通過呼叫虛擬函式可以在執行程式時實現動態繫結,體現
C++ 建構函式,解構函式中能否呼叫虛擬函式?
牛客網 ------------------- ------------------- ------------------- 設計模式 ------------------- -------------------
C++建構函式中呼叫虛擬函式是否有多型的效果
C++多型的一個重要應用就是虛擬函式。但是當我們再基類的建構函式中呼叫一個子類過載的虛擬函式會出現多型的效果嗎?我們具體看一下下面的例項: #include <iostream> #define P(x) std::cout<<x<<std::endl;
C++建構函式中呼叫虛擬函式
談談關於建構函式中呼叫虛擬函式的情況,僅討論單繼承,不考慮虛擬繼承和多重繼承。 測試平臺:VS2013 + Win7X64 一個例子: #include <stdlib.h> #i
C/C++—— 在建構函式中呼叫虛擬函式能實現多型嗎(Vptr指標初始化的過程分析)
問題引入: 比如:如果我們想在父類的建構函式中呼叫虛擬函式,當定義子類物件的時候,父類的建構函式中的虛擬函式執行的是子類中的函式。 在下面的例子中,定義子類物件的時候,在父類建構函式中的print虛擬函式執行的不是子類中的print函式,而是父類中的prin
C++ 建構函式中呼叫虛擬函式
我們知道:C++中的多型使得可以根據物件的真實型別(動態型別)呼叫不同的虛擬函式。這種呼叫都是物件已經構建完成的情況。那如果在建構函式中呼叫虛擬函式,會怎麼樣呢? 有這麼一段程式碼: class A { public: A ():m_iVal(0){test();}
C++中建構函式能呼叫虛擬函式嗎?
環境:XPSP3 VS2005 今天黑總給應聘者出了一個在C++的建構函式中呼叫虛擬函式的問題,具體的題目要比標題複雜,大體情況可以看如下的程式碼: class Base { public: Base() { Fuction(); }
在建構函式/解構函式中呼叫虛擬函式
先看一段在建構函式中直接呼叫虛擬函式的程式碼: 1 #include <iostream> 2 3 class Base 4 { 5 public: 6 Base() { Foo(); } ///< 列印 1 7 8
建構函式中是否可以呼叫虛擬函式
1. 從語法上講,呼叫完全沒有問題。 2. 但是從效果上看,往往不能達到需要的目的。 Effective 的解釋是: 派生類物件構造期間進入基類的建構函式時,物件型別變成了基類型別,而不是派生類型別。 同樣,進入基類解構函式時,物件也是基類型別。 所以,虛擬函式始終僅僅呼叫
多型性---建構函式和解構函式中呼叫虛擬函式
參考 C++ primer 15.4.5 /* 建構函式和解構函式中的虛擬函式 */ #include<iostream> using namespace std; class Base { public: //在建構函式和解構函式中呼叫虛擬函式,則執行自身型別定義的版本。原因是初始
【轉】C++在建構函式中可以呼叫另一個建構函式嗎
題目如下:問下列程式碼的列印結果為0嗎? #include <stdlib.h> #include <iostream> using namespace std; struct CLS
為什麼不要在建構函式中呼叫虛擬函式
先看一段在建構函式中直接呼叫虛擬函式的程式碼: #include <iostream> class Base { public: Base() { Foo(); } ///< 列印 1 virtual void Foo() { std:
虛解構函式 和 建構函式中最好不要呼叫虛擬函式
參考Effective c++ 條款7 和調款9 條款7: 多型性質的基類虛解構函式的重要性! 1、帶多型性質的 base classes應該宣告一個virtual 解構函式, 如果class帶有任何virtual函式,它就應該擁有一個virtual解構函
C++建構函式與解構函式呼叫虛擬函式的注意事項
雖然可以對虛擬函式進行實呼叫,但程式設計師編寫虛擬函式的本意應該是實現動態聯編。在建構函式中呼叫虛擬函式,函式的入口地址是在編譯時靜態確定的,並未實現虛呼叫。但是為什麼在建構函式中呼叫虛擬函式,實際上沒有發生動態聯編呢? 第一個原因,在概念上,建構函式的工作是
不要在建構函式和解構函式中呼叫虛擬函式
提到建構函式和解構函式,想必大家肯定是非常瞭解,但是能否在建構函式或是解構函式中呼叫虛擬函式呢? 答案是千萬不要這麼做,這麼做不會得到大家想要的結果。 首先提一下建構函式,建構函式的順序是從基類開始構造->子類,如果在基類中呼叫虛擬函式,由於建構函式基類中僅存在自身
C++在多層繼承中呼叫虛擬函式
在一個類中的虛擬函式說明,只對派生類中重定義的函式有影響,對它的基類中的函式不起作用。 例: #include <iostream> usingnamespacestd; class A { public: void show()
[c#]基類中不包含0個引數的建構函式
由於好久沒摸程式碼了 最近忙著找工作又重新寫點基礎的程式碼以備不時之需 今天在寫程式碼寫到關於派生類的問題上就突然出現瞭如標題的問題 一開始我是這樣寫的 然後就報了這個問題,我大概查了點資料‘ 大概的問題就出在Adult類的建構函式這裡 其實這裡的建構函式如果引數後面不寫
C++通過虛擬函式表呼叫虛擬函式
C++的類如果有虛擬函式,則該類的第一個成員的數值,是一個地址,指向其虛擬函式表。例如 class CTest { public: virtual void Test1(void) { cout<&l
《隨筆十二》—— C++中的 “ 純虛擬函式 和 抽象類 ”
目錄 抽象類 純虛擬函式 抽象類 ● 抽象類: 不用於定義物件而只作為一種基本型別用做繼承的類,稱為抽象類, 由於它常用於做基類, 通常稱為抽象基類。 那麼凡是包含純虛擬函式的類都是抽象類, 抽象類是一種特殊的類,