構造函數不能爲虛函數,析構函數可以爲虛函數
虛函數的調用需要虛表指針,虛表指針是由構造函數建立,指向虛表,所以構造函數不能爲虛函數,構造函數的作用爲用來實例化類,而虛函數是要求在運行時通過虛表來決定到底是調用哪個實現
析構函數可以爲虛函數,而且有時必須爲虛函數
析構函數設爲虛函數的作用:
解釋:在類的繼承中,如果有基類指針指向派生類,那麼用基類指針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
因此析構函數不聲明爲虛函數容易造成內存泄漏。