虛基類(lèi)的作用是什么 什么叫做虛基類(lèi)?
什么叫做虛基類(lèi)?什么叫做虛基類(lèi)?,也就是說(shuō),編譯器不能確定您是否在D中。在f()中調(diào)用哪個(gè)函數(shù)f。這可能會(huì)讓人覺(jué)得有點(diǎn)奇怪。命名只定義了一個(gè)CA::F。因?yàn)槊總€(gè)人都從CA派生,所以它自然地被稱(chēng)為CA:
什么叫做虛基類(lèi)?
什么叫做虛基類(lèi)?
,也就是說(shuō),編譯器不能確定您是否在D中。在f()中調(diào)用哪個(gè)函數(shù)f。這可能會(huì)讓人覺(jué)得有點(diǎn)奇怪。命名只定義了一個(gè)CA::F。因?yàn)槊總€(gè)人都從CA派生,所以它自然地被稱(chēng)為CA::F。為什么我們不能確定呢?
這是因?yàn)榫幾g器在編譯時(shí)需要確定子類(lèi)的函數(shù)定義。例如,確定CA::F。然后,在編譯CB和CC時(shí),它還需要在編譯器的語(yǔ)法樹(shù)中生成CB::F、CC::F和其他標(biāo)識(shí)符。然后,在編譯CD時(shí),由于CB和CC有一個(gè)函數(shù)f,編譯器將嘗試生成這兩個(gè)CD::f標(biāo)識(shí)符。很明顯,此時(shí)會(huì)報(bào)告錯(cuò)誤,為時(shí)已晚。
(當(dāng)我們不使用CD::F時(shí),不會(huì)生成上述任何標(biāo)記,因此如果我們刪除D.
要解決此問(wèn)題,有兩種方法:
1。重載函數(shù)f():此時(shí)由于我們已經(jīng)明確定義了CD::f,編譯器在檢查CD::f()調(diào)用時(shí)不需要一步一步生成CD::f label;
此時(shí)CD的元素結(jié)構(gòu)如下:| CB(CA)|
]| CC(CA)|
,所以sizeof(CD)=8(CB和CC各有一個(gè)元素K)
2。使用虛擬繼承:虛擬繼承也稱(chēng)為共享繼承。這種共享實(shí)際上是在編譯過(guò)程中實(shí)現(xiàn)的。當(dāng)使用虛擬繼承時(shí),上面的程序?qū)⒆兂扇缦滦问剑篶lass ca.
虛基類(lèi)的作用是什么?
語(yǔ)法中有抽象類(lèi)和虛擬基類(lèi),這并不意味著你必須使用它們。我通常不使用花哨的東西。
我可以考慮使用抽象類(lèi),也許可以利用這個(gè)優(yōu)勢(shì):
具有純虛擬函數(shù)的類(lèi)是抽象類(lèi)。這個(gè)函數(shù)實(shí)際上并沒(méi)有在基類(lèi)中使用,它只是通知編譯器:
在這里聲明一個(gè)虛擬函數(shù),讓它在派生類(lèi)中定義。為類(lèi)族提供公共接口。
例如,要計(jì)算平面形狀的面積,在抽象類(lèi)基類(lèi)中,virtualfloatarea()const=0
派生類(lèi)三角形和派生類(lèi)圓定義了面積()的具體計(jì)算。一旦我們有了一個(gè)派生的三角形或圓,我們就可以使用相同的函數(shù)名。Area()計(jì)算面積。
虛擬基類(lèi)的構(gòu)造應(yīng)在派生類(lèi)中完成,并且應(yīng)在派生類(lèi)本身的構(gòu)造之前完成。當(dāng)存在派生類(lèi)1、派生類(lèi)2和生成的派生類(lèi)12時(shí),派生類(lèi)12只執(zhí)行一次虛擬基類(lèi)的構(gòu)造。虛擬基類(lèi)只有一個(gè)對(duì)象。至于它的特殊用途,我沒(méi)想到。
創(chuàng)建子類(lèi)對(duì)象時(shí),子類(lèi)和父類(lèi)的構(gòu)造函數(shù)執(zhí)行順序是什么?
繼承時(shí),構(gòu)造函數(shù)的調(diào)用順序?yàn)椋?。如果繼承虛擬基類(lèi),則首先調(diào)用虛擬基類(lèi)的構(gòu)造函數(shù)。如果有多個(gè)虛擬基類(lèi),請(qǐng)按順序調(diào)用它們。
2. 如果基類(lèi)是繼承的,則調(diào)用基類(lèi)的構(gòu)造函數(shù);如果有多個(gè)基類(lèi),則按順序調(diào)用它們。三。如果類(lèi)中定義了成員對(duì)象,則調(diào)用成員對(duì)象的構(gòu)造函數(shù);如果有多個(gè)成員對(duì)象,則按成員對(duì)象定義的順序調(diào)用;4。調(diào)用自己的構(gòu)造函數(shù);析構(gòu)函數(shù)的調(diào)用順序相反。