构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。
構(gòu)造函數(shù)不可以是虛函數(shù);析構(gòu)函數(shù)可以是虛函數(shù),也可以是純虛函數(shù)。
一:構(gòu)造函數(shù)不能聲明為虛函數(shù)的原因
1 構(gòu)造一個(gè)對(duì)象的時(shí)候,必須知道對(duì)象的實(shí)際類型,而虛函數(shù)行為是在運(yùn)行期間確定實(shí)際類型的。
而在構(gòu)造一個(gè)對(duì)象時(shí),由于對(duì)象還未構(gòu)造成功。編譯器無(wú)法知道對(duì)象 的實(shí)際類型,是該類本身,
還是該類的一個(gè)派生類,或是更深層次的派生類。無(wú)法確定。
2 虛函數(shù)的執(zhí)行依賴于虛函數(shù)表。而虛函數(shù)表在構(gòu)造函數(shù)中進(jìn)行初始化工作,即初始化vptr,
讓他指向正確的虛函數(shù)表。
而在構(gòu)造對(duì)象期間,虛函數(shù)表還沒(méi)有被初 始化,將無(wú)法進(jìn)行。
二:析構(gòu)函數(shù)可以是虛函數(shù),也可以是純虛函數(shù)
?在某些類里聲明純虛析構(gòu)函數(shù)很方便。純虛函數(shù)將產(chǎn)生抽象類——不能實(shí)例化的類(即不能創(chuàng)建此類型的對(duì)象)。有些時(shí)候,你想使一個(gè)類成為抽象類,但剛好又沒(méi)有任何純虛函數(shù)。怎么辦?因?yàn)槌橄箢愂菧?zhǔn)備被用做基類的,基類必須要有一個(gè)虛析構(gòu)函數(shù),純虛函數(shù)會(huì)產(chǎn)生抽象類,所以方法很簡(jiǎn)單:在想要成為抽象類的類里聲明一個(gè)純虛析構(gòu)函數(shù)。
? ? 這個(gè)類有一個(gè)純虛函數(shù),所以它是抽象的,而且它有一個(gè)虛析構(gòu)函數(shù),所以不會(huì)產(chǎn)生析構(gòu)函數(shù)問(wèn)題。但這里還有一件事:必須提供純虛析構(gòu)函數(shù)的定義:
awov::~awov() {} // 純虛析構(gòu)函數(shù)的定義
? ? 這個(gè)定義是必需的,因?yàn)樘撐鰳?gòu)函數(shù)工作的方式是:最底層的派生類的析構(gòu)函數(shù)最先被調(diào)用,然后各個(gè)基類的析構(gòu)函數(shù)被調(diào)用。這就是說(shuō),即使是抽象類,編譯器也要產(chǎn)生對(duì)~awov的調(diào)用,所以要保證為它提供函數(shù)體。如果不這么做,鏈接器就會(huì)檢測(cè)出來(lái),最后還是得回去把它添上。
? ? 雖然抽象類的析構(gòu)函數(shù)可以是純虛函數(shù),但要實(shí)例化其派生類對(duì)象,仍必須提供抽象基類中析構(gòu)函數(shù)的函數(shù)體。抽象類的純虛函數(shù)的實(shí)現(xiàn)可以由自身給出,也可以由派生類給出。錯(cuò)了,除了析構(gòu)函數(shù)外,其他函數(shù)都不行,必須要在派生類中進(jìn)行實(shí)現(xiàn)
總結(jié)
以上是生活随笔為你收集整理的构造函数不可以是虚函数;析构函数可以是虚函数,也可以是纯虚函数。的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C和C++结构体的区别
- 下一篇: 多态定义、多态实现、多态分类。