关于动态空间的类指针跟构造析构的关系

关于动态空间的类指针和构造析构的关系?
class AA
{
public:
AA()
{
cout<<"AA constructor"<<endl;
m_aa=new char[10];
}
~AA()
{
delete []m_aa;
cout<<"~AA"<<endl;
}
private:
char* m_aa;
};

class BB:public AA
{
public:
BB()
{
cout<<"BB constructor"<<endl;
m_bb=new char[10];
}
~BB()
{
delete []m_bb;
cout<<"~BB"<<endl;
}
private:
char* m_bb;
};

int main()
{
        AA *paa;
BB *pbb=new BB;
paa=pbb;
delete paa;
        return 0;
}

输出结果是:
AA constructor
BB constructor
~AA

求问上面代码的具体调用过程是怎么样的?


------解决方案--------------------
//
1)BB *pbb=new BB;===>
  //1.1)
    pbb = operator new (sizoof(BB));
  //1.2) 
    new (pbb) BB();====> pbb->BB();===>
       lea ecx,pbb //this 指针
       call BB ===>
  {
    //1)  自动生成的代码,调用构造函数
     //先调用父类的构造函数,然后是,依序调用,非静态成员变量的构造函数.
     //初始化表里的顺序,和实际构造顺序无关
     //构造顺序,只和继承---父类---以及定义---成员变量---顺序有关.
     1.2.1) AA() ===>
       add ecx ,offset_AAofBB //AA 类子对象 的this 指针 = BB的 this + AA 在BB 内的偏移量     
       call AA===>
    {  
     1.2.1.1)  cout<<"AA constructor"<<endl;====>
       //输出  AA constructor
        m_aa=new char[10];
    }
   1.2.2)构造函数的内部代码{
    m_bb=new char[10];
   1.2.2.1) cout<<"BB constructor"<<endl;===>
      //输出    BB constructor
  }
}
//2)paa=pbb; //paa =pbb + offset_AAofBB

//3)delete paa;===>
  //3.1) 
      paa->~AA();===> 
         //输出  ~AA
  //3.2) 
      operator delete(paa);
PS :  

~BB 从来就没有执行过.
所以需要虚析构函数,才能在多态时,正确销毁,父类指针指向的,子类对象.