7. 在析构函数中也不要调用虚函数。在析构的时候会首先调用子类的析构函数,析构掉对象中的子类部分,然后在调用基类的析构函数析构基类部分,如果在基类的析构函数里面调用虚函数,会导致其调用已经析构了的子类对象里面的函数,这是非常危险的。
// virtualDestructor.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
class A
{
public:
A();
virtual ~A();
virtual void fun(){printf("virtual A::fun()\n");}
};
A::A()
{
}
A::~A()
{
printf("Delete class AP\n");
fun();
}
class B : public A
{
public:
B();
~B();
virtual void fun(){printf("virtual B::fun()\n");}
};
B::B()
{ }
B::~B()
{
printf("Delete class BP\n");
}
int main(int argc, char* argv[])
{
{
B b;
}
printf("======================\n");
A *b=new B;
delete b;
return 0;
}
/*
Delete class BP
Delete class AP
virtual A::fun()
======================
Delete class BP
Delete class AP
virtual A::fun()
Press any key to continue
*/