虚析构函数分析,为啥第一个输出是9,第二个输出是2呢

虚析构函数分析,为什么第一个输出是9,第二个输出是2呢?
有人可以帮我分析一下,下面的代码,为什么第一个输出结果是9,第二个输出结果会是2呢?


#include <iostream.h>

static int x;
class A
{
public:
A(){ cout<<"AA1"<<endl; x = 1; }
virtual ~A(){ cout<<"~A2"<<endl; x = 2; }
virtual void foo(){ cout<<"A::foo()A3"<<endl; x = 3;}
};

class B : public A
{
public:
B(){ cout<<"BB4"<<endl; x = 4; }
virtual ~B(){ cout<<"~B5"<<endl; x = 5; }
void foo(){ cout<<"B::foo()B6"<<endl; x = 6; }
void bar(){ cout<<"B::bar()"<<endl; foo(); }
};

class C : public B
{
public:
C(){ cout<<"CC7"<<endl;x = 7; }
virtual ~C(){ cout<<"~C8"<<endl; x = 8; }
void foo(){ cout<<"C::foo()C9"<<endl; x = 9 ;}
void bar(){ cout<<"C::bar()"<<endl; foo(); }
};



int main(void)
{
C testc;

testc.foo();
cout<<"1------------------------------------  "<< x<<endl;
((C)testc).foo();
cout<<"2------------------------------------  "<< x<<endl;
}

------解决方案--------------------
因为调用了两次析构,资料详解:
http://blog.****.net/kevinzhangyang/article/details/6638479

因为都是从A派生过来的,你在A的析构里面设置为了2所以是2
------解决方案--------------------
http://dev.yesky.com/145/2206145.shtml
------解决方案--------------------
add copy constructor, made it more clear:
static int x;
class A
{
public:
    A()
    {
        cout<<"AA1"<<endl;
        x = 1;
    }
    A(const A& a)
    {
        cout << "A copy constructor loaded" << endl;
        *this = a;
        x = 11;
    }
    virtual ~A()
    {
        cout<<"~A2"<<endl;
        x = 2;
    }
    virtual void foo()
    {
        cout<<"A::foo()A3"<<endl;
        x = 3;
    }
};

class B : public A
{
public:
    B()
    {
        cout<<"BB4"<<endl;
        x = 4;
    }
    B(const B& b)
    {
        cout << "B copy constructor loaded" << endl;
        *this = b;
        x = 12;
    }
    virtual ~B()
    {
        cout<<"~B5"<<endl;
        x = 5;
    }
    void foo()
    {
        cout<<"B::foo()B6"<<endl;
        x = 6;
    }
    void bar()
    {
        cout<<"B::bar()"<<endl;
        foo();
    }
};

class C : public B
{
public:
    C()
    {
        cout<<"CC7"<<endl;
        x = 7;
    }
    C(const C& c)
    {
        cout << "C copy constructor loaded" << endl;
        *this = c;
        x = 13;
    }
    virtual ~C()
    {
        cout<<"~C8"<<endl;
        x = 8;
    }
    void foo()
    {
        cout<<"C::foo()C9"<<endl;