关于虚析构函数
在看Effective C++,学习虚析构函数时有点疑惑,程序如下
using namespace std;
class EnemyTarget
{
public:
EnemyTarget(void){cout << "Target Num:" << ++targetNum << endl;}
EnemyTarget(EnemyTarget&){++targetNum;}
virtual ~EnemyTarget(void){cout << "Target Num:" << --targetNum << endl;}
virtual void Display(){cout << "Target Display" << endl;}
static int TargetNum(){return targetNum;}
private:
static int targetNum;
};
int EnemyTarget::targetNum;
class EnemyTank: public EnemyTarget
{
public:
EnemyTank(void){cout << "Tank Num:" << ++tankNum << endl;}
EnemyTank(EnemyTank& rhs):EnemyTarget(rhs){++tankNum;}
~EnemyTank(void){cout << "Tank Num:" << --tankNum << endl;}
void Display(){cout << "Tank Display" << endl;}
static int TankNum(){return tankNum;}
private:
static int tankNum;
};
int EnemyTank::tankNum;
int main()
{
EnemyTarget *pTarget = new EnemyTank();
pTarget->Display();
delete pTarget;
return 0;
}
输出的结果为:
Target Num:1
Tank Num:1
Tank Display
Tank Num:0
Target Num:0
而不是:
Target Num:1
Tank Num:1
Tank Display
Tank Num:0
我的疑问是:
virtual ~EnemyTarget(void){cout << "Target Num:" << --targetNum << endl;}这句话是怎么会被调用的,这里不是virtual了吗?我用一个基类指针指向子类,那它应该调用子类的析构函数,为什么连基类析构函数也一块调用了呢?是不是虚析构函数不但会调用子类的析构,而且连基类的析构也一起调用了,而除了析构函数则指调用派生类的函数,就像display调用的就是子类。