1樓:匿名使用者
因為當乙個建構函式被呼叫時,它做的首要的事情之一是初始化它的vptr。
因此,它只能知道它是「當前」類的,而完全忽視這個物件後面是否還有繼承者。當編譯器為這個建構函式產生**時,它是為這個類的建構函式產生**——既不是為基類,也不是為它的派生類(因為類不知道猜粗誰繼承它)。所以它使用的vptr必須是對於這個類的vtable。
而且,只要它巨集鄭是最後的建構函式呼叫,那麼在這個物件的生命期內,vptr將保持被初始化為指向這個vtable, 但如果接著還有乙個更晚派生的建構函式蔽兆頌被呼叫,這個建構函式又將設定vptr指向它的 vtable,等。直到最後的建構函式結束。
vptr的狀態是由被最後呼叫的建構函式確定的。
這就是為什麼建構函式呼叫是從基類到更加派生類順序的另乙個理由。
但是,當這一系列建構函式呼叫正發生時,每個建構函式都已經設定vptr指向它自己的vtable。如果函式呼叫使用虛機制,它將只產生通過它自己的vtable的呼叫,而不是最後的vtable(所有建構函式被呼叫後才會有最後的vtable)。
j**a中建立物件了,顯示初始化值和建構函式初始化物件的區別?先後執行順序是什麼?
2樓:無語人未休
先初始化物件吧,這樣才能給物件的屬性賦值,不太懂。
建構函式為什麼不可以宣告為虛擬函式?
3樓:網友
沒有想過語法為什麼這麼定義,不過實際中確實有這種需求,實現的方法是工廠模式(factory)。
4樓:網友
建構函式不能宣告為虛擬函式的原因是:
所謂虛擬函式就是多型情況下只執行乙個,而從繼承的概念來講,總是要先構造父類物件,然後才能是子類物件,如果建構函式設為虛擬函式,那麼當你在構造父類的建構函式時就不得不顯示的呼叫構造,還有乙個原因就是為了防錯,試想如果你在子類中一不小心重寫了個跟父類建構函式一樣的函式,那麼你的父類的建構函式將被覆蓋,也即不能完成父類的構造。就會出錯。
子類繼承了父類的public方法以後,當然可以在public中新增新的方法和屬性(屬性一般放在private或者protect裡面),這是繼承的基本用法哦。
5樓:
虛擬函式的意思就是開啟動態繫結,程式會根據物件的動態型別來選擇要呼叫的方法。然而在建構函式執行的時候,這個物件的動態型別還不完整,沒有辦法確定它到底是什麼型別,故建構函式不能動態繫結。(動態繫結是根據物件的動態型別而不是函式名,在呼叫建構函式之前,這個物件根本就不存在,它怎麼動態繫結?
如果要保留原來函式的功能,並且還要新添功能的話,可以在子類過載父類的這個函式,並在子類的這個函式中,通過「父類::函式名()」先呼叫父類的版本,然後再在後面加自己的東西。
先例項化物件,在用這個物件呼叫這個類的構造方法有什麼作用
6樓:r紅命硬是非多
構造方法的作用就是配合new例項化乙個該類的物件,至於繼承中,例項化子類物件時僅僅是呼叫了父類建構函式而已,並沒有例項化父類物件。
j**a中成員變數賦值和建構函式誰先執行?
7樓:網友
這是乙個有趣問題。我用new乙個物件時jvm的工作步驟來解釋。
在棧記憶體定義變數此時為初始值,定義方法。基本資料型別 int 0 。引用資料型別為null;
2. 呼叫父類構造方法,定義父類的屬性和方法(如果子類已經重寫父類的方法 這時不會被覆蓋,整個過程不會發生任何覆蓋的情況)。
父類的private方法是不能被重寫的,你把父類的getnum改成protected 和private結果是不一樣的!!
3. 給父類的變數賦值。
4. 執行父類構造方法中其他語句(此時它自己變數已經初始化和賦值完成,貌似很合理)。
5. 給自己變數賦值(在堆記憶體建立物件或常量)。
6. 執行構造方法中其他語句。
按照這個規則你分析一下你的**。就是這個結果了。
這同時能解釋為什麼在建構函式里super()必須寫在最前。這符合jvm的處理流程。子類構造方法裡只能呼叫一種父類構造方法。
同時也得出乙個值得注意的地方,構造方法裡儘量避免使用非private的方法。
還有因為泛型的原因 子類重寫的。
8樓:明明如月
你可以在裡面加上列印。一般的執行過程 變數 --構造器---方法。
9樓:網友
1、先將分配給物件的儲存空間初始化為0
2、由於有繼承關係,會先調基類的建構函式,此時物件中的num成員由於1的原因,所以結果是0
3、按宣告順序呼叫成員的初始化,這是物件中的num賦值為44、呼叫子類的構造器。
10樓:天亮中
應該是先執行父類然後在執行子類的。
父類建構函式中能產生多型嗎
11樓:網友
在父類的建構函式中確實沒有發生多型。原因是和vptr的初始化有關係。首先看見virtual,c++會這樣做:
呼叫父類建構函式時會給子類的vptr賦值指向父類的虛擬函式表,即vptr指標是分佈進行的:1、當執行父類的建構函式的時候,c++編譯器會初始化子類的vptr指標,讓vptr指標指向父類的虛擬函式表。如果你在父類的建構函式里面呼叫虛擬函式是不會找到子類虛擬函式的。
2、當父類的建構函式執行完畢之後在執行子類的建構函式,這個時候重新讓vptr指標真正的指向子類的虛擬函式表。
c++初始化順序這樣對嗎? 基類成員變數初始化-->>基類建構函式-->>派生類成員變數初始化-->
12樓:網友
樓主指的是初始化列表進行成員變數初始化?
初始化表初始化,遵循的原則是建構函式之前執行;
派生類在建構函式的初始化列表中呼叫基類的建構函式;
由以上兩點綜合一下,你的想法基本正確。
13樓:網友
乙個類的成員變數的初始化時機取決於建構函式的實現,如果是在建構函式內部實現,那先呼叫建構函式,再初始化成員變數。如果是在成員初始化列表裡初始化,那就是先初始化類成員,然後呼叫建構函式。
14樓:網友
成員變數在建構函式中初始化!
c++中,建構函式的執行流程是怎樣的?
15樓:廈門欣中特科技
1。類或結構體中的成員函式沒有執行順序關係。所有的執行一律從建構函式開始。跟你成員函式擺放的順序無關。除了建構函式和解構函式,所有成員函式都是顯式的呼叫到的時候才執行。
2。類或結構體中的非靜態 資料成員(或者叫成員變數)按他們在所在類或結構體中從上往下的順序(如果用逗號分隔的定義則是從左往右)一一構造。
3。建構函式很特殊。首先沒有返回值。
其次,這個函式在執行函式體中的**之前,首先會依次按順序2呼叫各個成員的預設建構函式(如果有的話)或者引數列表要求的建構函式,然後才進入執行函式體。
例子:struct a
a(void) ;
16樓:別跟我講冷笑話
執行只有在你用到那個函式的時候才會去執行,建構函式是因為為了建立物件系統自動呼叫給物件分配空間。
17樓:青木翠兮映春水
建構函式是你宣告物件時 系統就自動呼叫了 你可以在自定義的建構函式中輸出一段話 這樣你就知道是什麼時候呼叫的建構函式。
執行的名言名句,關於執行力的名言警句有哪些
人生就好比打牌,我們不可能處處都能得到好牌,我們能做的就是將手裡的牌精心打下去,即使那手牌再差再糟糕,也應該努力打出自己的水平,只要我們盡心盡力去打,差牌未必就會輸。三流的點子加一流的執行力,永遠比一流的點子加三流的執行力更好。最好的ceo是構建他們的團隊來達成夢想,即便是麥可喬丹也需要隊友來一起...
潛水軸流幫浦執行標準?潛水幫浦的執行標準
jb t 中小型軸流潛水電幫浦 對於潛水幫浦的執行標準來說,還是需要花費一定的時間去 的。就目前國內市場而言,國家對於大部分的商品都是有著一些生產標準,在接下來的內容中,就以德能幫浦業生產的潛水幫浦為例,來對潛水幫浦的執行標準進行詳細的解析。根據潛水幫浦的用途不同,標準可劃分為三個方面,分別為產品標準 設計標準...
強制執行被執行的生有生活保障嗎
強制執行被執老枝銀行的的人有生活保障的。最高人民法院關於人民法院民事執行中查侍宴封 扣押 凍結財產的規定 第六條 對被執行人及其所扶養家屬生活所必需的居搭廳住房屋,人民法院可以查封,但不得拍賣 變賣或者抵債。第七條 對於超過被執行人及其所扶養家屬生活所必需的房屋和生活用品,人民法院根據申請執行人的申...