能不能在建構函式和析構函式中呼叫虛函式?

2021-07-11 05:47:14 字數 607 閱讀 6164

可以,但是達不到想要的效果,應該盡可能避免在建構函式和析構函式中呼叫虛函式。

class base{

public:

base(){

cout<

當定義乙個derived例項物件時,在base的建構函式中呼叫size()會被靜態的決議為base::size()而不是derived::size()。

可以這麼理解,當在構造base部分時,derived並不乙個完整的例項物件,derived部分的成員變數甚至沒有被初始化,如果在構造base期間呼叫的是derived的虛函式並且該虛函式引用了尚未構造好的成員變數,試想會發生什麼。所以,從安全性考慮,經由構造中的物件來呼叫乙個虛函式,其函式就是正在構造的物件的所屬函式。

同時析構函式也如此。當正在析構base部分時,derived部分已經被析構完畢,成員變數已經無效,呼叫的虛函式是所屬base的。

下面解釋一下編譯器是怎麼做到的?

虛函式呼叫和例項物件的虛指標以及類的虛表有關。因此想要控制虛函式的呼叫,就必須控制虛指標的初始化。所以當乙個例項物件正在構造base部分時,此時該例項的虛指標必須指向base類的虛表。那麼虛指標何時被初始化,在程式設計師編寫的**之前或者是建構函式中初始化成員列表中所列的成員初始化操作之前。

C 中, 建構函式和析構函式能不能被顯示呼叫

include using namespace std class a a int ix a int main 輸出 default constructor is called.1 default constructor is called.2 another constructor is call...

C 中 建構函式和析構函式能不能被顯示呼叫

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!view plaincopy to clipboardprint?include using namespace std class a a int ix a int main include using namespace std class a...

C 中, 建構函式和析構函式能不能被顯示呼叫

乙個學姐提到的問題 include using namespace std class a a int ix a int main 輸出 default constructor is called.1 default constructor is called.2 another construct...