在基類建構函式中呼叫虛擬方法

2021-06-27 23:22:21 字數 1300 閱讀 3396

在c++builder中,vcl風格物件的執行時型別,是派生類的型別,並在呼叫基類建構函式期間不變。因此,如果基類構造函式呼叫乙個虛擬的方法,當派生類過載它時,派生類的方法將被呼叫,基類的不被呼叫。如果這個虛擬方法依賴於派生類建構函式體或初始化列表中的任何東西,方法仍在派生類建構函式之前被呼叫。例如createparams是乙個虛擬的成員函式,它在twincontrol的建構函式中間接地被呼叫。如果從twincontrol派生乙個類並過載createparams,以便它依賴於建構函式中的任何東西,在createparams被呼叫以後,這些**才被處理。這種狀況適用於乙個基類的任何派生類。如c從b派生,b從a派生。建立c的乙個例項,若b過載a類中的方法,但c沒有,a也將呼叫b過載的方法。

注意:要記住象createparams一樣的虛擬方法不是被構造顯式呼叫的,而是間接被呼叫的。

例子:呼叫虛擬方法

下例比較過載了虛擬方法的標準c++和vcl風格的類。這個例子說明來自基類建構函式的那些虛擬的方法的呼叫怎麼處理這兩種情況。mybase和myderived是標準的c++類。myvclbase和myvclderived是從tobject派生而來的vcl風格類。虛擬方法test()在派生類中被過載,但是僅在基類建構函式中被呼叫,派生類建構函式不呼叫。

上面這段話是從書上抄來的,所以很拗口。**如下:

//標準的c++風格

class mybase

virtual void test()

};class myderivaed:public mybase

};//vcl風格的類

class myvclbase:public tobject

virtual void __fastcall test()

};class myvclderived:public myvclbase

virtual void _fastcall test()

};void __fastcall tform1::button7click(tobject *sender)

執行結果:

對話方塊1顯示   "標準c++基類函式"

對話方塊2顯示   "vcl c++ 這是子類中的函式0「.

對話方塊2說明了在建立子類物件時,先呼叫基類建構函式,再呼叫自身的建構函式。這一點與標準c++是一樣的。但不同的時,當myvclderived的基類建構函式調虛函式test時,呼叫的不是基類中的test函式(在被過載的前提下),是子類myvclderived中的test函式。還有一點值得注意的是,雖然子類的過載的test函式中用到了子類成員變數i,結果顯示:這個變數i在子類建構函式執行前被調了,所以i的值為0。

在基類構造器中呼叫虛方法需謹慎

最近,在基類的建構函式中呼叫虛方法時,發現了乙個問題。先把問題重現如下 class program public class people protected people public virtual void say 歲了 age public class chinese people publ...

在派生類中呼叫基類方法。

base 關鍵字用於從派生類中訪問基類的成員 呼叫基類上已被其他方法重寫的方法。指定建立派生類例項時應呼叫的基類建構函式。基類訪問只能在建構函式 例項方法或例項屬性訪問器中進行。示例 在派生類中呼叫基類方法。base 關鍵字 訪問基類成員 using system public class base...

顯示呼叫基類的構造方法

def init self,例項 乙個物件裡面可以包含許多物件,可以層層呼叫。student類繼承human類的特徵,並增加了乙個score新屬性 doctor類繼承student類的特徵,並增加乙個grad新屬性。繼承父類的方法通過super 函式來實現。super student,self in...