下面是在学习虚析构函数的时候看到的一段代码:
class A
{
public :
~A()
{
cout << "A :: ~A() called" <<endl;
}
};
class B :public A
{
public :
B(int i ){ buf = new char[i] ; }
~B()
{
delete []buf ;
cout << "B :: ~B() called "<< endl;
}
private :
char *buf ;
};
void fun( A *a )
{
delete a ;
}
int main(void)
{
A *a = new B(5);
fun(a);
return 0;
}
输出结果:A :: ~A() called
原因:将派生类B的地址赋给基类A定义的指针对象时,C++编译器认为B是A的一个对象,会自动进行类型转换,此时C++编译器认为a保存的就是A的对象的地址,所以只会调用A的成员或成员函数。所以只会调用A的析构函数,故输出结果如上面。但是这样并没有释放buf的内存空间,应在~A()加上virtual关键字,才能保证~B()能够被执行。