#include
class a
{
public:
a(){cout < < "this is a " < virtual void show(){cout < < "a::show " < ~a(){cout < < "delete a " <
};
class b:public a
{
public:
b(){cout < < "this is b " < ~b(){cout < < "delete b " < void show(){cout < < "b::show " < void display(){show();};
};
void main()
{
a* pa;
pa=new b;
delete pa;
}
/*我知道析钩函数一定要声明为虚的,只有这样,在delete pa以后,才能按正确的顺序依次调用
派生类的析构和基类的析构来释后内存自由存储区,但我不明白的是为什么不虚,就会只调用一
次基类的析构函数,而不是派生类的析构函数。*/
=======================================================
如果函数不是 virtual 的,则进行的是静态绑定,即在编译期间就决定了其调用的函数。
对于上面的程序来说, delete pa;,即使基类指针 pa 实际上指向的是派生类对象,但是编译器也会把这个基类指针和指向类型(基类)的析构函数进行静态绑定,从而达不到调用派生类析构函数的目的。
阅读(1386) | 评论(0) | 转发(0) |