構造函數不能爲虛函數,析構函數可以爲虛函數



構造函數不能爲虛函數,析構函數可以爲虛函數

 

虛函數的調用需要虛表指針,虛表指針是由構造函數建立,指向虛表,所以構造函數不能爲虛函數,構造函數的作用爲用來實例化類,而虛函數是要求在運行時通過虛表來決定到底是調用哪個實現

 

析構函數可以爲虛函數,而且有時必須爲虛函數

 析構函數設爲虛函數的作用: 
解釋:在類的繼承中,如果有基類指針指向派生類,那麼用基類指針delete時,如果不定義成虛函數,派生類中派生的那部分無法析構。 

例: 

#include "stdafx.h" 

#include "stdio.h" 

class A 
{ 
public: 

A(); 
virtual ~A(); 

}; 
A::A() 
{ 

} 

A::~A() 
{ 

printf("Delete class AP/n"); 

} 
class B : public A 
{ 
public: 
B(); 
~B(); 

}; 

B::B() 
{ 

} 

B::~B() 
{ 
printf("Delete class BP/n"); 
} 
int main(int argc, char* argv[]) 
{ 
A *b=new B; 
delete b; 
return 0; 

} 



輸出結果爲:Delete class B 
Delete class A 

如果把A 的virtual 去掉: 
那就變成了Delete class A 

因此析構函數不聲明爲虛函數容易造成內存泄漏。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章