先上**:
// c_datastructure.cpp : 定義控制台應用程式的入口點。
此時發揮作用的是base:fun()而不是派生類a:fun(),也就是虛函式在建構函式中不起作用。
當例項化乙個派生類物件時,首先進行基類部分的構造,然後再進行派生類部分的構造。即建立a物件時,會先呼叫base的建構函式,再呼叫a的建構函式。
當在構造基類部分時,派生類還沒被完全建立,從某種意義上講此時它只是個基類物件。即當base::fun()執行時a物件還沒被完全建立,此時它被當成乙個base物件,而不是a物件,因此fun繫結的是base的fun
c++之所以這樣設計是為了減少錯誤和bug的出現。假設在建構函式中虛函式仍然「生效」,即base::fun()中的fun();所呼叫的是a::fun()。當base::fun()被呼叫時派生類中的資料a還未被正確初始化,這時執行a::fun()將導致程式對乙個未初始化的位址解引用,得到的結果是不可預料的,甚至是程式崩潰(訪問非法記憶體)。
為什麼建構函式不能為虛函式
1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。2,從使用角度 虛函式主要用...
建構函式為什麼不能是虛函式
1.從儲存空間角度,虛函式對應乙個指向vtable虛函式表的指標,這大家都知道,可是這個指向vtable的指標其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,怎麼找vtable呢?所以建構函式不能是虛函式。...
為什麼建構函式不能為虛函式
1,從儲存空間角度 虛函式對應乙個vtable,這大家都知道,可是這個vtable其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有,無法找到vtable,所以建構函式不能是虛函式。2,從使用角度 虛函式主要用...