c++关于沿袭的一道题

c++关于继承的一道题
#include <stdio.h>

class TestA
{
public:
TestA():mCount(0){}
virtual ~TestA() {   printf("Release A\n");   }
public:
virtual void init() {   mCount = 5 / 10;   }
virtual void increment() {   mCount++;   }
virtual void print() {   printf("This is A, count = %d\n", mCount);   }
private:
int mCount;
};

class TestB: public TestA
{
public:
TestB():mCount(0){}
virtual ~TestB() {   printf("Release B\n");   }
public:
virtual void init() {   mCount = 10;   }
virtual void print() {   printf("This is B, count = %d\n", mCount);   }
private:
int mCount;
};

int main()
{
TestB* pB = new TestB();
pB->init();
pB->increment();
pB->print();

TestA* pA = (TestA*)pB;
pA->init();
pA->increment();
pA->print();

TestA aA = *pB;
aA.init();
aA.increment();
aA.print();

delete pB;

return 0;
}

请写出打印结果,并解释一下原因。菜鸟求解。
c++ 继承

------解决方案--------------------
#include <stdio.h>

class TestA
{
public:
TestA():mCount(0){}
virtual ~TestA() {   printf("Release A\n");   }
public:
virtual void init() {   mCount = 5 / 10;   }
virtual void increment() {   mCount++;   }
virtual void print() {   printf("This is A, count = %d\n", mCount);   }
private:
int mCount;
};

class TestB: public TestA
{
public:
TestB():mCount(0){}
virtual ~TestB() {   printf("Release B\n");   }
public:
virtual void init() {   mCount = 10;   }
virtual void print() {   printf("This is B, count = %d\n", mCount);   }
private:
int mCount;
};

int main()
{
TestB* pB = new TestB();  
pB->init();      // mCount = 10;
pB->increment(); // 重点在这里,TestB中并没重写虚函数increment ,调用了TestA中
                         // 函数,并且使TestA::mCount数据成员自增+1, 然后再调用TestB中的打印函数
                              // TestB::mCount 为10,并不是11, 这里要分清楚是哪一个数据成员
pB->print();

TestA* pA = (TestA*)pB; // 这里涉及到多态,当用基类的指针指向派生类对象时,派生类中有虚函数,则会有一个虚指针,在分配的TestB内存块的最开头的前四个字节,指向TestB中存在的虚函数首地址,
可以在内存中用看pB的值,然后看内存,前四个字节为虚指针,所以pA指向了pB的虚指针所在内存块的地址,  
pA->init();   
pA->increment();
pA->print();  //因此此处和上面情况类似

TestA aA = *pB;//此处将*pB中已经对TeseA中的数据成员初始化了,并且将该值给了aA中的数据成员
aA.init();   mCount在函数调用前为0,调用后仍为0
aA.increment();mCount = 1;
aA.print();

delete pB; // pB为派生类对象指针,且TestA和TestB的析构均为虚析构,
                    会先调用B的析构,然后A的析构, 最后应用程序结束时,调用aA的析构函数
                        即Release B  ReleaseA ReleaseA

return 0;
}


------解决方案--------------------
    TestB* pB = new TestB(); 
    pB->init(); 
    pB->increment(); 
    pB->print();
    -- 上面三个调用的是B的函数,用的是B的mCount
  
    TestA* pA = (TestA*)pB; 
    pA->init(); 
    pA->increment(); 
    pA->print(); 
    -- 上面三个调用的是B的函数,用的是B的mCount

    TestA aA = *pB; 
    aA.init(); 
    aA.increment();