卖逼视频免费看片|狼人就干网中文字慕|成人av影院导航|人妻少妇精品无码专区二区妖婧|亚洲丝袜视频玖玖|一区二区免费中文|日本高清无码一区|国产91无码小说|国产黄片子视频91sese日韩|免费高清无码成人网站入口

多態(tài)的實現(xiàn)方式 構(gòu)造函數(shù)為什么不可以聲明為虛函數(shù)?

構(gòu)造函數(shù)為什么不可以聲明為虛函數(shù)?前面的回答都很靠譜的提到了重點:只有虛函數(shù)才會出現(xiàn)在虛函數(shù)表里;而且虛函數(shù)表里的項的順序并不保證跟類里虛函數(shù)的聲明順序一致。編譯器實現(xiàn)和ABI有決定vtable la

構(gòu)造函數(shù)為什么不可以聲明為虛函數(shù)?

前面的回答都很靠譜的提到了重點:只有虛函數(shù)才會出現(xiàn)在虛函數(shù)表里;而且虛函數(shù)表里的項的順序并不保證跟類里虛函數(shù)的聲明順序一致。編譯器實現(xiàn)和ABI有決定vtable layout的自由。

C 的類的構(gòu)造函數(shù)永遠(yuǎn)不是虛的。它只應(yīng)該在兩種場景使用,

  • 在new表達(dá)式中被調(diào)用:new表達(dá)式 = operator new調(diào)用 構(gòu)造函數(shù)調(diào)用。這里總是指定某個特定的類來new的,整個行為不會多態(tài),所以也沒有讓它成為虛函數(shù)的必要性。
    • 不過確實有時候大家會希望根據(jù)構(gòu)造的參數(shù)的不同而實質(zhì)上選擇某個子類來new。這種需求常常通過工廠函數(shù)(factory function)來解決。
  • 被子類的構(gòu)造器的初始化列表調(diào)用。C 里類繼承關(guān)系是靜態(tài)確定的,子類永遠(yuǎn)知道自己的基類是哪些,所以這個調(diào)用也不可能是虛的。

析構(gòu)函數(shù)則可能是虛的。跟構(gòu)造與析構(gòu)是對稱的過程,也正因為如此所以一個不會為虛而另一個可能為虛:
  • 構(gòu)造:以new表達(dá)式為例,這是從一個非多態(tài)的信息到一個可多態(tài)的指針的操作
  • 析構(gòu):以delete表達(dá)式為例,這是一個從可多態(tài)的指針要找到具體類型信息的操作

===========================================

至于如何在程序里找出構(gòu)造函數(shù)和析構(gòu)函數(shù)的地址。構(gòu)造函數(shù)的地址是肯定不會出現(xiàn)在vtable里的了。那咋搞?

題主給問題打上了逆向工程的標(biāo)簽,而且看來環(huán)境是MSVC,那如果目標(biāo)文件里還有符號表的話,其實最直觀的辦法就是去符號表里把構(gòu)造函數(shù)的decorated name對應(yīng)的地址項找出來。具體咋操作還得看題主到底是在什么條件下需要找出這個地址來做什么。

為什么構(gòu)造函數(shù)不能是虛函數(shù)?

構(gòu)造函數(shù)不能聲明為虛函數(shù)的原因是:所謂虛函數(shù)就是多態(tài)情況下只執(zhí)行一個,而從繼承的概念來講,總是要先構(gòu)造父類對象,然后才能是子類對象,如果構(gòu)造函數(shù)設(shè)為虛函數(shù),那么當(dāng)你在構(gòu)造父類的構(gòu)造函數(shù)時就不得不顯示的調(diào)用構(gòu)造,還有一個原因就是為了防錯,試想如果你在子類中一不小心重寫了個跟父類構(gòu)造函數(shù)一樣的函數(shù),那么你的父類的構(gòu)造函數(shù)將被覆蓋,也即不能完成父類的構(gòu)造.就會出錯.------子類繼承了父類的public方法以后,當(dāng)然可以在public中添加新的方法和屬性(屬性一般放在private或者protect里面),這是繼承的基本用法哦

為何構(gòu)造函數(shù)不能成為虛函數(shù)?

構(gòu)造函數(shù)的左右就是初始化變量等的值, VC 的語法是,只要用戶定義了構(gòu)造函數(shù),系統(tǒng)就不會提供任何構(gòu)造函數(shù) 如果將他定義成虛函數(shù),程序初始的時候不能初始化變量,不能申請內(nèi)存空間,程序會無法運行