為什麼不能在建構函式中使用虛函式

2021-08-11 03:26:45 字數 800 閱讀 5937

先上**:

// 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,從使用角度 虛函式主要用...