為什麼C 不能有虛建構函式,卻可以有虛析構函式

2021-06-06 03:57:28 字數 724 閱讀 1354

class b;

class d : public b

有天參加某大公司筆試,遇到這個問題,回來重新翻看c++教材和網上找答案,才恍然大悟。答案如下:

c++的動態繫結使用vtable(虛成員函式表)來實現。vtable支援執行時查詢,使系統可以將某一函式名繫結到vtable的特定入口位址。

例如上段**的虛函式表為:

虛成員函式       入口位址

虛成員函式            入口位址

b::m1              0x7723

d::m1                    0x99a7

b::m2              0x23b4

d::m2                   0x23b4

由於系統執行虛函式時,要從物件的vtable找到函式入口位址,而且vtable是儲存於物件的記憶體空間中。假如物件沒有例項化,就找不到vtable。因此,建構函式不能是vittual。

但是,析構函式一般都需要加上virtual,假如定義base *b = new deriver; deriver是base的子類,並且~base()不為virtual。那麼當物件被登出時,系統只會呼叫~base(),而不會呼叫~deriver(),因為b是base型別,已被靜態繫結析構函式。如果基類或子類用new建立了記憶體空間,就必須通過析構函式銷毀。因此必須使用vitual析構函式,實現動態繫結。

為什麼C 不能有虛建構函式,卻可以有虛析構函式

class b class d public b 1.從儲存空間角度,虛函式對應乙個指向vtable虛函式表的指標,這大家都知道,可是這個指向vtable的指標其實是儲存在物件的記憶體空間的。問題出來了,如果建構函式是虛的,就需要通過 vtable來呼叫,可是物件還沒有例項化,也就是記憶體空間還沒有...

建構函式為什麼不能是虛建構函式

class a private int value 為什麼建構函式不能是虛函式呢?這裡你需要知道乙個概念,那就是虛函式表vtbl,每乙個擁有虛成員函式的類都有乙個指向虛函式表的指標。物件通過虛函式表裡儲存的虛函式位址來呼叫虛函式。那虛函式表指標是什麼時候初始化的呢?當然是建構函式。當我們通過new來...

介面為什麼不能有建構函式

下面比較一下兩者的語法區別 1.抽象類可以有構造方法,介面中不能有構造方法。2.抽象類中可以有普通成員變數,介面中沒有普通成員變數 3.抽象類中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。抽象類中的抽象方法的訪問型別可以是public,protected和 預設...