C++中最好不要在构造函数和析构函数中调用虚函数
1.最好不要在基類和派生類的構(gòu)造和析構(gòu)函數(shù)中調(diào)用虛函數(shù),不會出現(xiàn)多態(tài)性
實例如下:
解釋: 第一段代碼不加說明,第二段代碼Derive *d = new Derive();先調(diào)用類的構(gòu)造函數(shù),這個構(gòu)造函數(shù)是基類Base的fun()函數(shù),因為此時派生類Derive還不存在,然后才構(gòu)造派生類Derive。析構(gòu)時,先析構(gòu)派生類Derive,并調(diào)用派生類的fun()函數(shù),再析構(gòu)基類。第三段代碼Base *bd = new Derive();基類Base的指針bd指向派生類對象。構(gòu)造時,先調(diào)用基類Base的構(gòu)造函數(shù),此時構(gòu)函數(shù)中調(diào)用基類中的fun()函數(shù),此時虛函數(shù)的動態(tài)綁定機(jī)制并沒有會生效,這是因為此時的派生類還不存在。析構(gòu)時,先析構(gòu)派生類,派生類中的fun()函數(shù)調(diào)用的是自己的fun(),然后析構(gòu)基類Base,基類析構(gòu)函數(shù)中的fun()調(diào)用的是基類Base自己的fun()函數(shù),這里虛函數(shù)的動態(tài)綁定機(jī)制也沒有生效,因為此時派生類已經(jīng)不存在了。
2.總結(jié)
不要在構(gòu)造函數(shù)中調(diào)用虛函數(shù)的原因:因為父類對象會在子類之前進(jìn)行構(gòu)造,此時子類部分的數(shù)據(jù)成員還未初始化, 因此調(diào)用子類的虛函數(shù)是不安全的,故而C++不會進(jìn)行動態(tài)聯(lián)編。
不要在析構(gòu)函數(shù)中調(diào)用虛函數(shù)的原因:析構(gòu)函數(shù)是用來銷毀一個對象的,在銷毀一個對象時,先調(diào)用子類的析構(gòu)函數(shù),然后再調(diào)用基類的析構(gòu)函數(shù)。所以在調(diào)用基類的析構(gòu)函數(shù)時,派生類對象的數(shù)據(jù)成員已經(jīng)“銷毀”,這個時再調(diào)用子類的虛函數(shù)已經(jīng)沒有意義了。
?
總結(jié)
以上是生活随笔為你收集整理的C++中最好不要在构造函数和析构函数中调用虚函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++primer 12.3.1文本查询
- 下一篇: s3c2440移植MQTT