C++基类派生类继承输出问题!

#include
using namespace std;
class A{
public:
virtual void F(){cout << 1 << endl;}
void CallF(){F();}
virtual ~A(){CallF(); F();}
};

class B : public A{
public:
void F(){cout << 2 << endl;}
~B(){}
};

class C : public B{
public:
void F(){cout << 3 << endl;}
void CallF(){F(); A::CallF();}
~C(){CallF();}
};
int main(){
A * p = new C();
p->CallF();
delete p;
return 0;
}

代码输出结果为33311。
我的理解是delete p语句首先调用派生类C析构函数,然后调用基类B的析构函数,接着调用A的析构函数。
当调用C的析构函数时,会执行C类的CallF()函数,为什么这一步会输出两个3?
当调用A的析构函数,为什么会输出两个1?

图片说明

#include <iostream>

using namespace std;

class A{
public:
virtual void F(){cout << 1 << endl;}
void CallF(){F();}
virtual ~A(){
    cout << "a1" << endl;
    CallF(); F();
    cout << "a2" << endl;
    }
};

class B : public A{
public:
void F(){cout << 2 << endl;}
~B(){cout << "b" << endl;}
};

class C : public B{
public:
void F(){cout << 3 << endl;}
void CallF(){F(); A::CallF();}
~C(){
    cout << "c1" << endl;
    CallF();
    cout << "c2" << endl;
    }
};
int main(){
A * p = new C();
p->CallF();
cout << "delete -> start" << endl;
delete p;
return 0;
}

加上输出就好了,输出两个和没有输出不都是你代码没写吗?