登報(bào)聲明 設(shè)置虛基類(lèi)的目的?
設(shè)置虛基類(lèi)的目的?其目的是消除歧義。當(dāng)多個(gè)繼承路徑上存在公共基類(lèi)時(shí),在多個(gè)路徑的匯合處,公共基類(lèi)將生成多個(gè)實(shí)例(或多個(gè)副本)。如果只想保存基類(lèi)的一個(gè)實(shí)例,可以將公共基類(lèi)描述為虛擬基類(lèi)。虛擬基類(lèi)的基本原
設(shè)置虛基類(lèi)的目的?
其目的是消除歧義。
當(dāng)多個(gè)繼承路徑上存在公共基類(lèi)時(shí),在多個(gè)路徑的匯合處,公共基類(lèi)將生成多個(gè)實(shí)例(或多個(gè)副本)。如果只想保存基類(lèi)的一個(gè)實(shí)例,可以將公共基類(lèi)描述為虛擬基類(lèi)。
虛擬基類(lèi)的基本原則是在內(nèi)存中只有其成員的一個(gè)副本。這樣,通過(guò)將基類(lèi)繼承聲明為虛繼承,只能繼承基類(lèi)的一個(gè)副本,從而消除了歧義。使用虛擬限定符將基類(lèi)繼承描述為虛擬的。
虛基類(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)想到。
怎樣理解c 中的虛基類(lèi)和虛函數(shù).純虛函數(shù)?
虛擬函數(shù)和純虛擬函數(shù)有以下區(qū)別。(1) 如果在類(lèi)中聲明了虛函數(shù),則即使該函數(shù)為空,也會(huì)實(shí)現(xiàn)該函數(shù)。它的目的是使函數(shù)能夠包含在其子類(lèi)中。這樣,編譯器就可以使用后期綁定來(lái)實(shí)現(xiàn)多態(tài)性。純虛函數(shù)只是一個(gè)接口,一個(gè)函數(shù)的聲明,需要在子類(lèi)中實(shí)現(xiàn)。(2) 虛擬函數(shù)不能在子類(lèi)中重載,但是純虛擬函數(shù)必須在子類(lèi)中實(shí)現(xiàn),就像Java接口一樣。一般來(lái)說(shuō),在許多函數(shù)中添加虛擬元素是一個(gè)好習(xí)慣。雖然犧牲了一些性能,但是面向?qū)ο蟮亩鄳B(tài)性增加了,因?yàn)楹茈y預(yù)測(cè)父類(lèi)中的函數(shù)不在子類(lèi)中,并且它的實(shí)現(xiàn)不會(huì)被修改。(3) 虛函數(shù)類(lèi)用于“實(shí)現(xiàn)繼承”,不僅繼承接口,而且繼承父類(lèi)的實(shí)現(xiàn)。當(dāng)然,你也可以完成你自己的實(shí)現(xiàn)。純虛函數(shù)注重接口的統(tǒng)一性,通過(guò)子類(lèi)實(shí)現(xiàn)。(4) 具有純虛函數(shù)的類(lèi)稱(chēng)為虛基類(lèi)。這種基類(lèi)不能直接生成對(duì)象。只有繼承并重寫(xiě)虛擬函數(shù)后才能使用。這樣的類(lèi)也稱(chēng)為抽象類(lèi)。在任何非虛擬基類(lèi)構(gòu)造函數(shù)之前調(diào)用虛擬基類(lèi)的構(gòu)造函數(shù)。如果構(gòu)造中包含多個(gè)虛擬基類(lèi),則它們的調(diào)用順序?yàn)槁暶黜樞?。如果虛擬類(lèi)是從非虛擬類(lèi)派生的,則首先調(diào)用非虛擬類(lèi)的構(gòu)造函數(shù)。
下面是一個(gè)示例:
class X:public y,virtual public Z
X one
調(diào)用順序如下:
Z()//虛擬基類(lèi)初始化
y()//非虛擬基類(lèi)
X()//繼承類(lèi)
有虛基類(lèi)時(shí),多繼承構(gòu)造函數(shù)調(diào)用順序?
首先,我們應(yīng)該知道,C是為數(shù)不多的支持“多重繼承”的語(yǔ)言之一。多重繼承帶來(lái)了許多問(wèn)題,其中之一就是鉆石繼承:classAclassB:公共許可證:公共ICAD類(lèi):公共為了解決這個(gè)問(wèn)題,引入了虛擬基類(lèi)的概念。在實(shí)際開(kāi)發(fā)中,這種情況是可以避免的。基本上,它們繼承一個(gè)類(lèi)并實(shí)現(xiàn)多個(gè)“接口”。在C語(yǔ)言中沒(méi)有接口概念,但是只有純虛函數(shù)的類(lèi)本質(zhì)上是一個(gè)接口。在C中沒(méi)有實(shí)現(xiàn)接口的概念,但是繼承一個(gè)只有純虛函數(shù)的類(lèi)本質(zhì)上就是實(shí)現(xiàn)一個(gè)接口。這就是C中多重繼承的一般用法。這降低了設(shè)計(jì)的復(fù)雜性,減少了問(wèn)題的發(fā)生