#include<iostream.h>
class A
{
public:
 ~A()
{
cout<<"This is A";
}
};class B:public A
{
public:
 virtual ~B()
{
cout<<"This is B";
}
};void main()
{
A *a=new B;
delete a;
}

解决方案 »

  1.   

    要说出错,你这个a其实是B类的实例,调用delete a产生内存访问错误。
    delete (B*)a;
    就不会错了。或者,要使用虚函数实现动态创建和销毁:
    class A
    {
    public:
     ~A()
    {
    cout<<"This is A";
    }
    virtual void Destroy() {delete this;}
    };class B:public A
    {
    public:
    virtual ~B()
    {
    cout<<"This is B";
    }
    void Destroy() {delete this;}
    };int _tmain(int argc, _TCHAR* argv[])
    {
    A *a=new B;
    //delete (B*)a;
    a->Destroy();
    }
      

  2.   

    其实,更常用的是虚析构函数,注意,指的是基类的析构函数要定义为虚函数:
    class A
    {
    public:
     virtual ~A()
    {
    cout<<"This is A";
    }
    virtual void Destroy() {delete this;}
    };class B:public A
    {
    public:
    virtual ~B() //这里是不是virtual没有关系
    {
    cout<<"This is B";
    }
    void Destroy() {delete this;}
    };int _tmain(int argc, _TCHAR* argv[])
    {
    A *a=new B;
    delete a;
    }
      

  3.   

    为什么把B中的virtual去掉就OK呢?