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